corrade-vassal – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 vero 1 using System;
2 using System.Collections.Generic;
3 using Gtk;
4  
5 namespace GridProxyGUI
6 {
7 internal class MessageScroller : TreeView
8 {
9 public static string[] ColumnLabels = { "Nr", "Timestamp", "Protocol", "Type", "Size", "URL", "Content Type" };
10 Dictionary<string, int> ColumnMap = new Dictionary<string, int>();
11  
12 public ListStore Messages;
13 public bool AutoScroll = true;
14 MainWindow Main;
15  
16 public MessageScroller(MainWindow main)
17 {
18 this.Main = main;
19  
20 for (int i = 0; i < ColumnLabels.Length; i++)
21 {
22 CellRendererText cell = new CellRendererText();
23 TreeViewColumn col = new TreeViewColumn();
24 col.PackStart(cell, true);
25 col.SetCellDataFunc(cell, CellDataFunc);
26 col.Title = ColumnLabels[i];
27 AppendColumn(col);
28 ColumnMap[ColumnLabels[i]] = i;
29 }
30  
31 Model = Messages = new ListStore(typeof(Session));
32 HeadersVisible = true;
33 Selection.Mode = SelectionMode.Multiple;
34 ShowAll();
35 }
36  
37 protected void ShowContext()
38 {
39 var selected = Selection.GetSelectedRows();
40 if (selected.Length < 1) return;
41  
42 Menu context = new Menu();
43  
44 MenuItem item = new MenuItem("Remove");
45 item.Activated += (sender, e) =>
46 {
47 foreach (var p in selected)
48 {
49 TreeIter iter;
50 if (Messages.GetIter(out iter, p))
51 {
52 Messages.Remove(ref iter);
53 }
54 }
55 Selection.UnselectAll();
56 };
57 context.Add(item);
58  
59 if (selected.Length == 1)
60 {
61 TreeIter iter;
62 Messages.GetIter(out iter, selected[0]);
63 var session = Messages.GetValue(iter, 0) as Session;
64 if (session != null)
65 {
66 item = new MenuItem("Remove All " + session.Name);
67 item.Activated += (sender, e) =>
68 {
69 TreeIter delIter;
70 Messages.GetIterFirst(out delIter);
71  
72 while (Messages.IterIsValid(delIter))
73 {
74 var delSession = Messages.GetValue(delIter, 0) as Session;
75 if (delSession != null && delSession.GetType() == session.GetType() && delSession.Name == session.Name)
76 {
77 Messages.Remove(ref delIter);
78 }
79 else
80 {
81 Messages.IterNext(ref delIter);
82 }
83 }
84 };
85 context.Add(item);
86  
87 item = new MenuItem("Remove and Filter Out All " + session.Name);
88 item.Activated += (sender, e) =>
89 {
90 TreeIter delIter;
91 Messages.GetIterFirst(out delIter);
92  
93 FilterItem filterOut = Main.GetFilter(session);
94 if (filterOut != null)
95 {
96 filterOut.Enabled = false;
97 }
98 Main.RedrawFilters();
99  
100 while (Messages.IterIsValid(delIter))
101 {
102 var delSession = Messages.GetValue(delIter, 0) as Session;
103 if (delSession != null && delSession.GetType() == session.GetType() && delSession.Name == session.Name)
104 {
105 Messages.Remove(ref delIter);
106 }
107 else
108 {
109 Messages.IterNext(ref delIter);
110 }
111 }
112 };
113 context.Add(item);
114  
115  
116 FilterItem filter = Main.GetFilter(session);
117 if (filter != null)
118 {
119 var citem = new CheckMenuItem("Receive " + session.Name);
120 citem.Active = filter.Enabled;
121 citem.Toggled += (sender, e) =>
122 {
123 filter.Enabled = !filter.Enabled;
124 Main.RedrawFilters();
125 };
126 context.Add(citem);
127 }
128 }
129 }
130  
131 context.Add(new SeparatorMenuItem());
132  
133 item = new MenuItem("Select All");
134 item.Activated += (sender, e) =>
135 {
136 Selection.SelectAll();
137 };
138 context.Add(item);
139  
140 item = new MenuItem("Deselect");
141 item.Activated += (sender, e) =>
142 {
143 Selection.UnselectAll();
144 };
145 context.Add(item);
146  
147 context.Add(new SeparatorMenuItem());
148  
149 item = new MenuItem("Copy");
150 item.Activated += (sender, e) =>
151 {
152 System.Text.StringBuilder sb = new System.Text.StringBuilder();
153 foreach (var p in selected)
154 {
155 TreeIter iter;
156 if (Messages.GetIter(out iter, p))
157 {
158 var session = Messages.GetValue(iter, 0) as Session;
159 if (session != null)
160 {
161 sb.AppendLine(string.Join(" | ", session.Columns));
162 }
163 }
164  
165 Gtk.Clipboard.Get(Gdk.Atom.Intern("CLIPBOARD", false)).Text = sb.ToString().TrimEnd();
166 }
167 };
168 context.Add(item);
169  
170 item = new MenuItem("Clear");
171 item.Activated += (sender, e) =>
172 {
173 Selection.UnselectAll();
174 Messages.Clear();
175 };
176 context.Add(item);
177  
178 context.ShowAll();
179 context.Popup();
180 }
181  
182 protected override bool OnButtonPressEvent(Gdk.EventButton evnt)
183 {
184 if (evnt.Type == Gdk.EventType.ButtonPress && evnt.Button == 3) // right click press
185 {
186 TreePath path;
187 if (GetPathAtPos((int)evnt.X, (int)evnt.Y, out path))
188 {
189 bool amISelected = false;
190 foreach (var p in Selection.GetSelectedRows())
191 {
192 if (p.Compare(path) == 0)
193 {
194 amISelected = true;
195 break;
196 }
197 }
198  
199 if (!amISelected)
200 {
201 Selection.UnselectAll();
202 Selection.SelectPath(path);
203 }
204 }
205  
206 ShowContext();
207  
208 return true;
209 }
210  
211 return base.OnButtonPressEvent(evnt);
212 }
213  
214 void CellDataFunc(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
215 {
216 var item = model.GetValue(iter, 0) as Session;
217 if (item != null)
218 {
219 if (ColumnMap.ContainsKey(column.Title))
220 {
221 int pos = ColumnMap[column.Title];
222 if (pos < item.Columns.Length)
223 {
224 ((CellRendererText)cell).Text = item.Columns[pos];
225 }
226 }
227 }
228 }
229  
230 public void AddSession(Session s)
231 {
232 TreeIter iter = Messages.AppendValues(s);
233 if (AutoScroll)
234 {
235 ScrollToCell(Messages.GetPath(iter), null, true, 0, 0);
236 }
237 }
238 }
239 }