corrade-vassal – Blame information for rev 1
?pathlinks?
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 | } |