Stores the metadata of an item in the folder selection dialog.
예제 #1
0
        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);
        }