Ora si possono annulare in maniera sicura i trasferimenti.

Leonardo Robol [2010-02-11 21:25]
Ora si possono annulare in maniera sicura i trasferimenti.
Filename
Dizzy/EventManager.cs
Dizzy/FileTransfer.cs
Dizzy/MainWindow.cs
Dizzy/Protocol.cs
Dizzy/TaskTreeView.cs
gtk-gui/MainWindow.cs
gtk-gui/gui.stetic
diff --git a/Dizzy/EventManager.cs b/Dizzy/EventManager.cs
index b71aeda..efa2a88 100644
--- a/Dizzy/EventManager.cs
+++ b/Dizzy/EventManager.cs
@@ -151,24 +151,36 @@ namespace Dizzy

 		}

-		public static void TaskTreeViewSetProgress (TreeIter iter, int perc)
+		public static void TaskTreeViewSetProgress (string GUID, int perc)
 		{
 			if (taskTreeView == null)
 				return;
+			TreeIter iter;
+			try {iter = iters[GUID];}
+			catch (System.Collections.Generic.KeyNotFoundException)
+			{
+				// Questo si può verificare se abbiamo annullato il trasferimento
+				// e già tolto il task, ma _get di sharpssh se ne deve ancora
+				// rendere conto. In questo caso facciamo finta di nulla, tanto
+				// se ne accorgerà appena avrà svuotato il buffer.
+				return;
+			}
 			GLib.Idle.Add(delegate {
 				taskTreeView.SetProgress (iter, perc);
 				return false;
 			});
 		}

-		public static void TaskTreeViewRemove (TreeIter iter)
+		public static void TaskTreeViewRemove (string GUID)
 		{
 			if (taskTreeView == null)
 				return;
+			TreeIter iter = iters[GUID];
 			GLib.Idle.Add (delegate {
 				taskTreeView.DeleteRow (iter);
 				return false;
 			});
+			iters.Remove (GUID);
 		}

 		public static void AddIter (string GUID, TreeIter iter)
@@ -181,7 +193,6 @@ namespace Dizzy
 			TreeIter ret;
 			try {
 				ret = iters[GUID];
-				iters.Remove (GUID);
 				return ret;
 			}
 			catch (Exception e)
@@ -193,5 +204,16 @@ namespace Dizzy
 			return GetIter(GUID);
 		}

+		public static string GetGUID (TreePath path)
+		{
+			foreach(KeyValuePair<string, TreeIter> pair in iters)
+			{
+				if (taskTreeView.IterToPath (pair.Value).Compare(path) == 0)
+					return pair.Key;
+			}
+			Log.Warning ("TreePath non trovato, ritorno null");
+			return null;
+		}
+
 	}
 }
diff --git a/Dizzy/FileTransfer.cs b/Dizzy/FileTransfer.cs
index bb24a5b..993eec0 100644
--- a/Dizzy/FileTransfer.cs
+++ b/Dizzy/FileTransfer.cs
@@ -6,11 +6,7 @@ namespace Dizzy

 	public abstract class FileTransfer
 	{
-
-		// Questo è il riferimento all'elemento della taskview che
-		// creeremo per monitorare il progress.
-		protected Gtk.TreeIter iter;
-
+
 		// La connessione vera e propria al server
 		protected SFTPConnection sftp;

@@ -38,6 +34,8 @@ namespace Dizzy
 			this.label = label;
 		}

+		public string GetGUID () {return GUID;}
+
 		public virtual void Start () {}

 		public void Stop ()
@@ -45,6 +43,11 @@ namespace Dizzy
 			// Queste chiamate dovrebbero essere piuttosto standard in tutti
 			// i trasferimenti di file che per il momento ci possiamo immaginare.
 			this.sftp.Abort ();
+			EventManager.TaskTreeViewRemove (GUID);
+
+			// Aspettiamo un momento sperando di riuscire ad evitare
+			// che _get si blocchi.
+			System.Threading.Thread.Sleep (200);
 			this.sftp.Disconnect ();
 		}

@@ -58,20 +61,20 @@ namespace Dizzy
 		{
 			GUID =	System.Guid.NewGuid().ToString();
 			EventManager.TaskTreeViewAddTask (label, 0, GUID);
-			this.iter = EventManager.GetIter (GUID);
+			// this.iter = EventManager.GetIter (GUID);
 		}

 		public void OnTransferProgress(string src, string dest, int transferredBytes,
 		                               int totalBytes, string message)
 		{
 			int perc = transferredBytes / (totalBytes / 100);
-			EventManager.TaskTreeViewSetProgress (this.iter, perc);
+			EventManager.TaskTreeViewSetProgress (GUID, perc);
 		}

 		public void OnTransferStopped (string src, string dest, int transferredBytes,
 		                               int totalBytes, string message)
 		{
-			EventManager.TaskTreeViewRemove (iter);
+			EventManager.TaskTreeViewRemove (GUID);
 		}
 	}
 }
diff --git a/Dizzy/MainWindow.cs b/Dizzy/MainWindow.cs
index 3b170ff..983f89f 100644
--- a/Dizzy/MainWindow.cs
+++ b/Dizzy/MainWindow.cs
@@ -115,4 +115,27 @@ public partial class MainWindow : Gtk.Window
 		this.protocol.Upload(uploadChooserButton.Filename);

 	}
+
+
+	protected virtual void OnTasklistCursorChanged (object sender, System.EventArgs e)
+	{
+		if (tasklist.Selection != null)
+			blockTransfer.Sensitive = true;
+		else
+			blockTransfer.Sensitive = false;
+	}
+
+	protected virtual void OnBlockTransferClicked (object sender, System.EventArgs e)
+	{
+		// Dobbiamo determinare che trasferimento bloccare
+		TreePath path;
+		path = tasks.GetActivePath ();
+		string GUID = EventManager.GetGUID (path);
+		this.protocol.DisconnectPath (GUID);
+	}
+
+
+
+
+
 }
\ No newline at end of file
diff --git a/Dizzy/Protocol.cs b/Dizzy/Protocol.cs
index ee6a979..7cdec44 100644
--- a/Dizzy/Protocol.cs
+++ b/Dizzy/Protocol.cs
@@ -190,7 +190,22 @@ namespace Dizzy
 			}

 		}
-
+
+		public void DisconnectPath (string GUID)
+		{
+			FileTransfer stoppedTransfer = null;
+			foreach(FileTransfer t in this.transfers)
+			{
+				if ( t.GetGUID () == GUID)
+				{
+					t.Stop ();
+					stoppedTransfer = t;
+				}
+			}
+			if(stoppedTransfer != null)
+				transfers.Remove (stoppedTransfer);
+		}
+

 		public void Download(File f, string downloadFolder)
 		{
@@ -216,17 +231,23 @@ namespace Dizzy
 			string downloadFolder = (string) ((ArrayList) args)[1];
 			Log.Info ("Avvio il download di " + f.name);

+			FileDownlad transfer;
 			try {
-				FileDownlad transfer = new FileDownlad (f, this.config.GetValue("user"), this.config.password, downloadFolder);
+				transfer = new FileDownlad (f, this.config.GetValue("user"), this.config.password, downloadFolder);
 				this.transfers.Add (transfer);
-				transfer.Start ();
 			} catch (Exception e) {
 				Log.Error (e.Message);
 				this.config.authenticated = false;

 				EventManager.ErrorMessage ("Autenticazione fallita");
+				return;
 			}

+			try {transfer.Start ();}
+			catch (Exception) {
+				// Si lamenterà se e quando termineremo il trasferimento
+				// brutalmente ma per ora sembra che non ci possiamo fare niente.
+			}

 		}

@@ -252,15 +273,23 @@ namespace Dizzy
 			string f = (string) ((ArrayList) args)[0];
 			Log.Info ("Avvio l'upload di " + f);

+			FileUpload transfer;
 			try {
-				FileUpload transfer = new FileUpload (f, this.config.GetValue("user"), this.config.password);
+				transfer = new FileUpload (f, this.config.GetValue("user"), this.config.password);
 				this.transfers.Add (transfer);
-				transfer.Start ();
+
 			} catch (Exception e) {

 				Log.Error (e.Message);
 				this.config.authenticated = false;
 				EventManager.ErrorMessage ("Autenticazione fallita");
+				return;
+			}
+
+			try {transfer.Start ();}
+			catch (Exception) {
+				// Ci potrebbero essere dei problemi ma per ora non
+				// vogliamo occuparcene.
 			}
 		}

diff --git a/Dizzy/TaskTreeView.cs b/Dizzy/TaskTreeView.cs
index 8f90d4b..7e02605 100644
--- a/Dizzy/TaskTreeView.cs
+++ b/Dizzy/TaskTreeView.cs
@@ -38,6 +38,19 @@ namespace Dizzy
 			this.tree.Model = tasklist;
 		}

+		public TreePath GetActivePath ()
+		{
+			TreeIter iter;
+			TreeSelection sel = tree.Selection;
+			sel.GetSelected (out iter);
+			return tasklist.GetPath (iter);
+		}
+
+		public TreePath IterToPath (TreeIter iter)
+		{
+			return tasklist.GetPath (iter);
+		}
+
 		protected void CellSetup ()
 		{
 			CellRendererText fileRenderer = new CellRendererText ();
diff --git a/gtk-gui/MainWindow.cs b/gtk-gui/MainWindow.cs
index c77515f..3fa436f 100644
--- a/gtk-gui/MainWindow.cs
+++ b/gtk-gui/MainWindow.cs
@@ -50,6 +50,8 @@ public partial class MainWindow {

     private Gtk.FileChooserButton downloadpathchooser;

+    private Gtk.Button blockTransfer;
+
     private Gtk.Label label3;

     private Gtk.Table table2;
@@ -100,7 +102,7 @@ public partial class MainWindow {
         this.notebook1 = new Gtk.Notebook();
         this.notebook1.CanFocus = true;
         this.notebook1.Name = "notebook1";
-        this.notebook1.CurrentPage = 2;
+        this.notebook1.CurrentPage = 1;
         // Container child notebook1.Gtk.Notebook+NotebookChild
         this.vbox3 = new Gtk.VBox();
         this.vbox3.Name = "vbox3";
@@ -241,14 +243,27 @@ public partial class MainWindow {
         this.hbox2.Add(this.downloadpathchooser);
         Gtk.Box.BoxChild w14 = ((Gtk.Box.BoxChild)(this.hbox2[this.downloadpathchooser]));
         w14.Position = 1;
-        this.vbox2.Add(this.hbox2);
-        Gtk.Box.BoxChild w15 = ((Gtk.Box.BoxChild)(this.vbox2[this.hbox2]));
-        w15.Position = 1;
+        // Container child hbox2.Gtk.Box+BoxChild
+        this.blockTransfer = new Gtk.Button();
+        this.blockTransfer.Sensitive = false;
+        this.blockTransfer.CanFocus = true;
+        this.blockTransfer.Name = "blockTransfer";
+        this.blockTransfer.UseUnderline = true;
+        this.blockTransfer.Label = Mono.Unix.Catalog.GetString("Blocca trasferimento");
+        this.hbox2.Add(this.blockTransfer);
+        Gtk.Box.BoxChild w15 = ((Gtk.Box.BoxChild)(this.hbox2[this.blockTransfer]));
+        w15.PackType = ((Gtk.PackType)(1));
+        w15.Position = 2;
         w15.Expand = false;
         w15.Fill = false;
-        this.notebook1.Add(this.vbox2);
-        Gtk.Notebook.NotebookChild w16 = ((Gtk.Notebook.NotebookChild)(this.notebook1[this.vbox2]));
+        this.vbox2.Add(this.hbox2);
+        Gtk.Box.BoxChild w16 = ((Gtk.Box.BoxChild)(this.vbox2[this.hbox2]));
         w16.Position = 1;
+        w16.Expand = false;
+        w16.Fill = false;
+        this.notebook1.Add(this.vbox2);
+        Gtk.Notebook.NotebookChild w17 = ((Gtk.Notebook.NotebookChild)(this.notebook1[this.vbox2]));
+        w17.Position = 1;
         // Notebook tab
         this.label3 = new Gtk.Label();
         this.label3.Name = "label3";
@@ -272,11 +287,11 @@ public partial class MainWindow {
         this.label10.UseMarkup = true;
         this.alignment1.Add(this.label10);
         this.table2.Add(this.alignment1);
-        Gtk.Table.TableChild w18 = ((Gtk.Table.TableChild)(this.table2[this.alignment1]));
-        w18.TopAttach = ((uint)(3));
-        w18.BottomAttach = ((uint)(4));
-        w18.XOptions = ((Gtk.AttachOptions)(4));
-        w18.YOptions = ((Gtk.AttachOptions)(4));
+        Gtk.Table.TableChild w19 = ((Gtk.Table.TableChild)(this.table2[this.alignment1]));
+        w19.TopAttach = ((uint)(3));
+        w19.BottomAttach = ((uint)(4));
+        w19.XOptions = ((Gtk.AttachOptions)(4));
+        w19.YOptions = ((Gtk.AttachOptions)(4));
         // Container child table2.Gtk.Table+TableChild
         this.alignment2 = new Gtk.Alignment(0.5F, 0.5F, 1F, 1F);
         this.alignment2.Name = "alignment2";
@@ -288,9 +303,9 @@ public partial class MainWindow {
         this.label5.UseMarkup = true;
         this.alignment2.Add(this.label5);
         this.table2.Add(this.alignment2);
-        Gtk.Table.TableChild w20 = ((Gtk.Table.TableChild)(this.table2[this.alignment2]));
-        w20.XOptions = ((Gtk.AttachOptions)(4));
-        w20.YOptions = ((Gtk.AttachOptions)(4));
+        Gtk.Table.TableChild w21 = ((Gtk.Table.TableChild)(this.table2[this.alignment2]));
+        w21.XOptions = ((Gtk.AttachOptions)(4));
+        w21.YOptions = ((Gtk.AttachOptions)(4));
         // Container child table2.Gtk.Table+TableChild
         this.alignment3 = new Gtk.Alignment(0F, 0.5F, 1F, 1F);
         this.alignment3.Name = "alignment3";
@@ -302,10 +317,10 @@ public partial class MainWindow {
         this.label8.Wrap = true;
         this.alignment3.Add(this.label8);
         this.table2.Add(this.alignment3);
-        Gtk.Table.TableChild w22 = ((Gtk.Table.TableChild)(this.table2[this.alignment3]));
-        w22.TopAttach = ((uint)(1));
-        w22.BottomAttach = ((uint)(2));
-        w22.YOptions = ((Gtk.AttachOptions)(4));
+        Gtk.Table.TableChild w23 = ((Gtk.Table.TableChild)(this.table2[this.alignment3]));
+        w23.TopAttach = ((uint)(1));
+        w23.BottomAttach = ((uint)(2));
+        w23.YOptions = ((Gtk.AttachOptions)(4));
         // Container child table2.Gtk.Table+TableChild
         this.alignment4 = new Gtk.Alignment(0.5F, 0.5F, 1F, 1F);
         this.alignment4.Name = "alignment4";
@@ -317,11 +332,11 @@ public partial class MainWindow {
         this.label9.Wrap = true;
         this.alignment4.Add(this.label9);
         this.table2.Add(this.alignment4);
-        Gtk.Table.TableChild w24 = ((Gtk.Table.TableChild)(this.table2[this.alignment4]));
-        w24.TopAttach = ((uint)(2));
-        w24.BottomAttach = ((uint)(3));
-        w24.XOptions = ((Gtk.AttachOptions)(4));
-        w24.YOptions = ((Gtk.AttachOptions)(4));
+        Gtk.Table.TableChild w25 = ((Gtk.Table.TableChild)(this.table2[this.alignment4]));
+        w25.TopAttach = ((uint)(2));
+        w25.BottomAttach = ((uint)(3));
+        w25.XOptions = ((Gtk.AttachOptions)(4));
+        w25.YOptions = ((Gtk.AttachOptions)(4));
         // Container child table2.Gtk.Table+TableChild
         this.button182 = new Gtk.Button();
         this.button182.CanFocus = true;
@@ -329,13 +344,13 @@ public partial class MainWindow {
         this.button182.UseUnderline = true;
         this.button182.Label = Mono.Unix.Catalog.GetString("Disconnetti");
         this.table2.Add(this.button182);
-        Gtk.Table.TableChild w25 = ((Gtk.Table.TableChild)(this.table2[this.button182]));
-        w25.TopAttach = ((uint)(1));
-        w25.BottomAttach = ((uint)(2));
-        w25.LeftAttach = ((uint)(1));
-        w25.RightAttach = ((uint)(2));
-        w25.XOptions = ((Gtk.AttachOptions)(4));
-        w25.YOptions = ((Gtk.AttachOptions)(4));
+        Gtk.Table.TableChild w26 = ((Gtk.Table.TableChild)(this.table2[this.button182]));
+        w26.TopAttach = ((uint)(1));
+        w26.BottomAttach = ((uint)(2));
+        w26.LeftAttach = ((uint)(1));
+        w26.RightAttach = ((uint)(2));
+        w26.XOptions = ((Gtk.AttachOptions)(4));
+        w26.YOptions = ((Gtk.AttachOptions)(4));
         // Container child table2.Gtk.Table+TableChild
         this.button183 = new Gtk.Button();
         this.button183.CanFocus = true;
@@ -343,13 +358,13 @@ public partial class MainWindow {
         this.button183.UseUnderline = true;
         this.button183.Label = Mono.Unix.Catalog.GetString("Aggiorna lista");
         this.table2.Add(this.button183);
-        Gtk.Table.TableChild w26 = ((Gtk.Table.TableChild)(this.table2[this.button183]));
-        w26.TopAttach = ((uint)(2));
-        w26.BottomAttach = ((uint)(3));
-        w26.LeftAttach = ((uint)(1));
-        w26.RightAttach = ((uint)(2));
-        w26.XOptions = ((Gtk.AttachOptions)(4));
-        w26.YOptions = ((Gtk.AttachOptions)(4));
+        Gtk.Table.TableChild w27 = ((Gtk.Table.TableChild)(this.table2[this.button183]));
+        w27.TopAttach = ((uint)(2));
+        w27.BottomAttach = ((uint)(3));
+        w27.LeftAttach = ((uint)(1));
+        w27.RightAttach = ((uint)(2));
+        w27.XOptions = ((Gtk.AttachOptions)(4));
+        w27.YOptions = ((Gtk.AttachOptions)(4));
         // Container child table2.Gtk.Table+TableChild
         this.button184 = new Gtk.Button();
         this.button184.CanFocus = true;
@@ -357,25 +372,25 @@ public partial class MainWindow {
         this.button184.UseUnderline = true;
         this.button184.Label = Mono.Unix.Catalog.GetString("Carica file");
         this.table2.Add(this.button184);
-        Gtk.Table.TableChild w27 = ((Gtk.Table.TableChild)(this.table2[this.button184]));
-        w27.TopAttach = ((uint)(4));
-        w27.BottomAttach = ((uint)(5));
-        w27.LeftAttach = ((uint)(1));
-        w27.RightAttach = ((uint)(2));
-        w27.XOptions = ((Gtk.AttachOptions)(4));
-        w27.YOptions = ((Gtk.AttachOptions)(4));
-        // Container child table2.Gtk.Table+TableChild
-        this.uploadChooserButton = new Gtk.FileChooserButton(Mono.Unix.Catalog.GetString("Seleziona un file"), ((Gtk.FileChooserAction)(0)));
-        this.uploadChooserButton.Name = "uploadChooserButton";
-        this.table2.Add(this.uploadChooserButton);
-        Gtk.Table.TableChild w28 = ((Gtk.Table.TableChild)(this.table2[this.uploadChooserButton]));
+        Gtk.Table.TableChild w28 = ((Gtk.Table.TableChild)(this.table2[this.button184]));
         w28.TopAttach = ((uint)(4));
         w28.BottomAttach = ((uint)(5));
+        w28.LeftAttach = ((uint)(1));
+        w28.RightAttach = ((uint)(2));
         w28.XOptions = ((Gtk.AttachOptions)(4));
         w28.YOptions = ((Gtk.AttachOptions)(4));
+        // Container child table2.Gtk.Table+TableChild
+        this.uploadChooserButton = new Gtk.FileChooserButton(Mono.Unix.Catalog.GetString("Seleziona un file"), ((Gtk.FileChooserAction)(0)));
+        this.uploadChooserButton.Name = "uploadChooserButton";
+        this.table2.Add(this.uploadChooserButton);
+        Gtk.Table.TableChild w29 = ((Gtk.Table.TableChild)(this.table2[this.uploadChooserButton]));
+        w29.TopAttach = ((uint)(4));
+        w29.BottomAttach = ((uint)(5));
+        w29.XOptions = ((Gtk.AttachOptions)(4));
+        w29.YOptions = ((Gtk.AttachOptions)(4));
         this.notebook1.Add(this.table2);
-        Gtk.Notebook.NotebookChild w29 = ((Gtk.Notebook.NotebookChild)(this.notebook1[this.table2]));
-        w29.Position = 2;
+        Gtk.Notebook.NotebookChild w30 = ((Gtk.Notebook.NotebookChild)(this.notebook1[this.table2]));
+        w30.Position = 2;
         // Notebook tab
         this.label7 = new Gtk.Label();
         this.label7.Name = "label7";
@@ -383,17 +398,17 @@ public partial class MainWindow {
         this.notebook1.SetTabLabel(this.table2, this.label7);
         this.label7.ShowAll();
         this.vbox1.Add(this.notebook1);
-        Gtk.Box.BoxChild w30 = ((Gtk.Box.BoxChild)(this.vbox1[this.notebook1]));
-        w30.Position = 0;
+        Gtk.Box.BoxChild w31 = ((Gtk.Box.BoxChild)(this.vbox1[this.notebook1]));
+        w31.Position = 0;
         // Container child vbox1.Gtk.Box+BoxChild
         this.dizzystatus = new Gtk.Statusbar();
         this.dizzystatus.Name = "dizzystatus";
         this.dizzystatus.Spacing = 6;
         this.vbox1.Add(this.dizzystatus);
-        Gtk.Box.BoxChild w31 = ((Gtk.Box.BoxChild)(this.vbox1[this.dizzystatus]));
-        w31.Position = 1;
-        w31.Expand = false;
-        w31.Fill = false;
+        Gtk.Box.BoxChild w32 = ((Gtk.Box.BoxChild)(this.vbox1[this.dizzystatus]));
+        w32.Position = 1;
+        w32.Expand = false;
+        w32.Fill = false;
         this.Add(this.vbox1);
         if ((this.Child != null)) {
             this.Child.ShowAll();
@@ -402,7 +417,9 @@ public partial class MainWindow {
         this.DeleteEvent += new Gtk.DeleteEventHandler(this.OnDeleteEvent);
         this.button1.Clicked += new System.EventHandler(this.OnSearchRequested);
         this.filelist.RowActivated += new Gtk.RowActivatedHandler(this.OnRowActivated);
+        this.tasklist.CursorChanged += new System.EventHandler(this.OnTasklistCursorChanged);
         this.downloadpathchooser.SelectionChanged += new System.EventHandler(this.OnDownloadPathSelectionChanged);
+        this.blockTransfer.Clicked += new System.EventHandler(this.OnBlockTransferClicked);
         this.button184.Clicked += new System.EventHandler(this.OnUploadRequested);
         this.button183.Clicked += new System.EventHandler(this.OnListUpdateRequired);
         this.button182.Clicked += new System.EventHandler(this.OnDisconnectionRequested);
diff --git a/gtk-gui/gui.stetic b/gtk-gui/gui.stetic
index 6195a84..cd9154e 100644
--- a/gtk-gui/gui.stetic
+++ b/gtk-gui/gui.stetic
@@ -25,7 +25,7 @@
           <widget class="Gtk.Notebook" id="notebook1">
             <property name="MemberName" />
             <property name="CanFocus">True</property>
-            <property name="CurrentPage">2</property>
+            <property name="CurrentPage">1</property>
             <child>
               <widget class="Gtk.VBox" id="vbox3">
                 <property name="MemberName" />
@@ -215,6 +215,7 @@ Libro</property>
                         <property name="MemberName" />
                         <property name="CanFocus">True</property>
                         <property name="ShowScrollbars">True</property>
+                        <signal name="CursorChanged" handler="OnTasklistCursorChanged" />
                       </widget>
                     </child>
                   </widget>
@@ -252,6 +253,24 @@ Libro</property>
                         <property name="AutoSize">True</property>
                       </packing>
                     </child>
+                    <child>
+                      <widget class="Gtk.Button" id="blockTransfer">
+                        <property name="MemberName" />
+                        <property name="Sensitive">False</property>
+                        <property name="CanFocus">True</property>
+                        <property name="Type">TextOnly</property>
+                        <property name="Label" translatable="yes">Blocca trasferimento</property>
+                        <property name="UseUnderline">True</property>
+                        <signal name="Clicked" handler="OnBlockTransferClicked" />
+                      </widget>
+                      <packing>
+                        <property name="PackType">End</property>
+                        <property name="Position">2</property>
+                        <property name="AutoSize">True</property>
+                        <property name="Expand">False</property>
+                        <property name="Fill">False</property>
+                      </packing>
+                    </child>
                   </widget>
                   <packing>
                     <property name="Position">1</property>
ViewGit