first.working.version
[tfs.git] / class / Gtk.TeamFoundation / ChangesetView.cs
blobaa47018503b75fb61472004ca9ef264bea7662bb
1 using System;
2 using System.IO;
3 using System.Collections;
4 using System.Collections.Generic;
5 using System.Net;
6 using System.Text;
7 using Gtk;
8 using Microsoft.TeamFoundation.Client;
9 using Microsoft.TeamFoundation.VersionControl.Common;
10 using Microsoft.TeamFoundation.VersionControl.Client;
12 namespace Gtk.TeamFoundation
14 public interface IChangesetViewChild
16 void UpdateCid(VersionControlServer vcs, int cid);
19 public class ChangesetView : Gtk.VPaned, IExploreViewChild
21 private Gtk.ListStore changesetListStore;
22 private Gtk.TreeView changesetList;
23 private ChangesetDetailView changesetDetailView;
24 private ChangesetDiffView changesetDiffView;
25 private Notebook viewChildren;
26 private int stopAfter;
27 private int currentCid = 0;
28 private SortableColumns sortableColumns;
29 private VersionControlServer currentVcs;
31 private TreeViewColumn AppendColumn(string name, int indx)
33 TreeViewColumn column = changesetList.AppendColumn (name, new Gtk.CellRendererText (), "text", indx);
35 column.Clickable = true;
36 column.Resizable = true;
37 column.SortColumnId = indx;
38 column.Clicked += new EventHandler (sortableColumns.OnColumnClick);
40 return column;
43 public void InitializeChangesetList()
45 changesetListStore = new Gtk.ListStore (typeof(int), typeof(string), typeof(string), typeof(string));
46 changesetList = new Gtk.TreeView(changesetListStore);
47 sortableColumns = new SortableColumns(changesetList, changesetListStore);
49 TreeViewColumn id = AppendColumn("Id", 0);
50 id.SortIndicator = true;
51 id.SortOrder = SortType.Descending;
53 AppendColumn("Owner", 1);
54 AppendColumn("Date", 2);
55 AppendColumn("Comment", 3);
57 changesetList.Selection.Mode = SelectionMode.Multiple;
58 changesetList.Selection.Changed += OnSelectionChanged;
59 changesetList.KeyReleaseEvent += MyKeyReleaseEventHandler;
61 #if HAVE_ATLEAST_GTK_210
62 changesetList.EnableGridLines = TreeViewGridLines.Vertical;
63 #endif
66 public ChangesetView(int stopAfter)
68 this.stopAfter = stopAfter;
70 InitializeChangesetList();
72 ScrolledWindow scrolledWindow1 = new ScrolledWindow();
73 scrolledWindow1.Add(changesetList);
75 Add1(scrolledWindow1);
77 viewChildren = new Notebook ();
78 viewChildren.TabPos = PositionType.Bottom;
79 Add2(viewChildren);
81 changesetDetailView = new ChangesetDetailView();
82 viewChildren.AppendPage(changesetDetailView, new Label ("Details"));
84 changesetDiffView = new ChangesetDiffView();
85 viewChildren.AppendPage(changesetDiffView, new Label ("Unified Diff"));
87 int x, y, width, height, depth;
88 RootWindow.GetGeometry(out x, out y, out width, out height, out depth);
89 Position = Convert.ToInt32((height - 40) * 0.4);
91 viewChildren.SwitchPage += OnSwitchPage;
94 public void OnSwitchPage(object o, SwitchPageArgs args)
96 if (currentCid == 0) return;
97 IChangesetViewChild child = viewChildren.GetNthPage((int)args.PageNum) as IChangesetViewChild;
98 UpdateChildCid(child);
101 protected void UpdateChildCid(IChangesetViewChild child)
103 if (child == null) return;
104 GdkWindow.Cursor = new Gdk.Cursor(Gdk.CursorType.Watch);
105 child.UpdateCid(currentVcs, currentCid);
106 GdkWindow.Cursor = null;
109 void OnSelectionChanged (object o, EventArgs args)
111 TreeIter iter;
112 TreeModel model;
114 TreeSelection treeSelection = o as TreeSelection;
115 int count = treeSelection.CountSelectedRows();
116 if (count == 0 || count > 1)
118 changesetDetailView.Clear();
119 changesetDiffView.Clear();
120 return;
123 TreePath[] paths = treeSelection.GetSelectedRows(out model);
124 foreach (TreePath path in paths)
126 model.GetIter(out iter, path);
127 currentCid = Convert.ToInt32(model.GetValue (iter, 0));
130 IChangesetViewChild child = viewChildren.CurrentPageWidget as IChangesetViewChild;
131 UpdateChildCid(child);
134 public void UpdatePath(VersionControlServer vcs, string path)
136 if (String.IsNullOrEmpty(path)) return;
137 currentVcs = vcs;
139 changesetListStore.Clear();
140 changesetDetailView.Clear();
141 changesetDiffView.Clear();
143 bool detailed = false;
144 IEnumerable changeSets = vcs.QueryHistory(path, VersionSpec.Latest, 0, RecursionType.Full, null,
145 null, null, stopAfter, detailed, false, false);
147 foreach (Changeset changeSet in changeSets)
149 changesetListStore.AppendValues(changeSet.ChangesetId,
150 changeSet.Owner,
151 changeSet.CreationDate.ToString("d"),
152 changeSet.Comment);
155 // this would be nice be seems to cause a segfault
156 //changesetList.ColumnsAutosize();
159 public void MyKeyReleaseEventHandler (object o, KeyReleaseEventArgs args)
161 if ((Gdk.Key.c == args.Event.Key) && ((args.Event.State & Gdk.ModifierType.ControlMask) != 0))
163 TreeIter iter; TreeModel model;
164 TreePath[] paths = changesetList.Selection.GetSelectedRows(out model);
166 StringBuilder sb = new StringBuilder();
167 foreach (TreePath path in paths)
169 model.GetIter(out iter, path);
170 sb.Append(String.Format("{0} {1} {2} {3}\n",
171 Convert.ToInt32(model.GetValue (iter, 0)),
172 Convert.ToString(model.GetValue (iter, 1)),
173 Convert.ToString(model.GetValue (iter, 2)),
174 Convert.ToString(model.GetValue (iter, 3)) ));
177 Clipboard primary = Clipboard.Get(Gdk.Atom.Intern ("PRIMARY", false));
178 primary.Text = sb.ToString();