3 using System
.Collections
;
4 using System
.Collections
.Generic
;
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
);
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
;
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
;
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
)
114 TreeSelection treeSelection
= o
as TreeSelection
;
115 int count
= treeSelection
.CountSelectedRows();
116 if (count
== 0 || count
> 1)
118 changesetDetailView
.Clear();
119 changesetDiffView
.Clear();
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;
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
,
151 changeSet
.CreationDate
.ToString("d"),
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();