private void ShowAdd2Page() { Header = CmisSync.Properties_Resources.ResourceManager.GetString("Which", CultureInfo.CurrentCulture); VBox layout_vertical = new VBox(false, 12); Button cancel_button = new Button(cancelText); cancel_button.Clicked += delegate { Controller.PageCancelled(); }; Button continue_button = new Button(continueText) { Sensitive = false }; continue_button.Clicked += delegate { Controller.Add2PageCompleted( Controller.saved_repository, Controller.saved_remote_path); }; Button back_button = new Button(backText) { Sensitive = true }; back_button.Clicked += delegate { Controller.BackToPage1(); }; TreeStore repoStore = new Gtk.TreeStore(typeof(string), typeof(SelectionTreeItem)); TreeIter iter; foreach (KeyValuePair <String, String> repository in Controller.repositories) { iter = repoStore.AppendNode(); repoStore.SetValues(iter, repository.Value, new SelectionTreeItem(repository.Key, "/")); } Gtk.TreeView treeView = new Gtk.TreeView(repoStore); treeView.HeadersVisible = false; treeView.Selection.Mode = SelectionMode.Single; treeView.AppendColumn("Name", new CellRendererText(), "text", 0); treeView.CursorChanged += delegate(object o, EventArgs args) { TreeSelection selection = (o as TreeView).Selection; TreeModel model; if (selection.GetSelected(out model, out iter)) { SelectionTreeItem sti = model.GetValue(iter, 1) as SelectionTreeItem; // Identify the selected remote path. Controller.saved_remote_path = sti.fullPath; // Identify the selected repository. TreeIter cnode = iter; TreeIter pnode = iter; while (model.IterParent(out pnode, cnode)) { cnode = pnode; } Controller.saved_repository = (model.GetValue(cnode, 1) as SelectionTreeItem).repository; // Load sub-folders if it has not been done already. // We use each item's Tag to store metadata: whether this item's subfolders have been loaded or not. if (sti.childrenLoaded == false) { this.GdkWindow.Cursor = wait_cursor; // Get list of subfolders asynchronously GetSubfoldersDelegate dlgt = new GetSubfoldersDelegate(CmisUtils.GetSubfolders); IAsyncResult ar = dlgt.BeginInvoke(Controller.saved_repository, Controller.saved_remote_path, Controller.saved_address.ToString(), Controller.saved_user, Controller.saved_password, null, null); while (!ar.AsyncWaitHandle.WaitOne(100)) { while (Application.EventsPending()) { Application.RunIteration(); } } string[] subfolders = dlgt.EndInvoke(ar); TreePath tp = null; // Create a sub-item for each subfolder foreach (string subfolder in subfolders) { TreeIter newchild = repoStore.AppendNode(iter); repoStore.SetValues(newchild, System.IO.Path.GetFileName(subfolder), new SelectionTreeItem(null, subfolder)); if (null == tp) { tp = repoStore.GetPath(newchild); } } sti.childrenLoaded = true; if (null != tp) { treeView.ExpandToPath(tp); } this.GdkWindow.Cursor = default_cursor; } continue_button.Sensitive = true; } }; ScrolledWindow sw = new ScrolledWindow() { ShadowType = Gtk.ShadowType.In }; sw.Add(treeView); layout_vertical.PackStart(new Label(""), false, false, 0); layout_vertical.PackStart(sw, true, true, 0); Add(layout_vertical); AddButton(back_button); AddButton(continue_button); AddButton(cancel_button); }