Ejemplo n.º 1
0
        public static ToolStripItem[] RecentMenu(this RecentFiles recent, Action<string> loadFileCallback, bool autoload = false)
        {
            var items = new List<ToolStripItem>();

            if (recent.Empty)
            {
                var none = new ToolStripMenuItem { Enabled = false, Text = "None" };
                items.Add(none);
            }
            else
            {
                foreach (var filename in recent)
                {
                    //TODO - do TSMI and TSDD need disposing? yuck
                    var temp = filename;
                    var item = new ToolStripMenuItem { Text = temp };
                    items.Add(item);

                    item.Click += (o, ev) =>
                    {
                        loadFileCallback(temp);
                    };

                    //TODO - use standard methods to split filename (hawkfile acquire?)
                    var hf = new HawkFile();
                    hf.Parse(temp);
                    bool canExplore = true;
                    if (!File.Exists(hf.FullPathWithoutMember))
                        canExplore = false;

                    var tsdd = new ToolStripDropDownMenu();

                    if (canExplore)
                    {
                        //make a menuitem to show the last modified timestamp
                        var timestamp = File.GetLastWriteTime(hf.FullPathWithoutMember);
                        var tsmiTimestamp = new ToolStripLabel { Text = timestamp.ToString() };

                        tsdd.Items.Add(tsmiTimestamp);
                        tsdd.Items.Add(new ToolStripSeparator());

                        if (hf.IsArchive)
                        {
                            //make a menuitem to let you copy the path
                            var tsmiCopyCanonicalPath = new ToolStripMenuItem { Text = "&Copy Canonical Path" };
                            tsmiCopyCanonicalPath.Click += (o, ev) => { System.Windows.Forms.Clipboard.SetText(temp); };
                            tsdd.Items.Add(tsmiCopyCanonicalPath);

                            var tsmiCopyArchivePath = new ToolStripMenuItem { Text = "Copy Archive Path" };
                            tsmiCopyArchivePath.Click += (o, ev) => { System.Windows.Forms.Clipboard.SetText(hf.FullPathWithoutMember); };
                            tsdd.Items.Add(tsmiCopyArchivePath);

                            var tsmiOpenArchive = new ToolStripMenuItem { Text = "Open &Archive" };
                            tsmiOpenArchive.Click += (o, ev) => { System.Diagnostics.Process.Start(hf.FullPathWithoutMember); };
                            tsdd.Items.Add(tsmiOpenArchive);
                        }
                        else
                        {
                            //make a menuitem to let you copy the path
                            var tsmiCopyPath = new ToolStripMenuItem { Text = "&Copy Path" };
                            tsmiCopyPath.Click += (o, ev) => { System.Windows.Forms.Clipboard.SetText(temp); };
                            tsdd.Items.Add(tsmiCopyPath);
                        }

                        tsdd.Items.Add(new ToolStripSeparator());

                        //make a menuitem to let you explore to it
                        var tsmiExplore = new ToolStripMenuItem { Text = "&Explore" };
                        string explorePath = "\"" + hf.FullPathWithoutMember + "\"";
                        tsmiExplore.Click += (o, ev) => { System.Diagnostics.Process.Start("explorer.exe", "/select, " + explorePath); };
                        tsdd.Items.Add(tsmiExplore);

                        var tsmiCopyFile = new ToolStripMenuItem { Text = "Copy &File" };
                        var lame = new System.Collections.Specialized.StringCollection();
                        lame.Add(hf.FullPathWithoutMember);
                        tsmiCopyFile.Click += (o, ev) => { System.Windows.Forms.Clipboard.SetFileDropList(lame); };
                        tsdd.Items.Add(tsmiCopyFile);

                        var tsmiTest = new ToolStripMenuItem { Text = "&Shell Context Menu" };
                        tsmiTest.Click += (o, ev) => {
                            var si = new GongSolutions.Shell.ShellItem(hf.FullPathWithoutMember);
                            var scm = new GongSolutions.Shell.ShellContextMenu(si);
                            var tsddi = o as ToolStripDropDownItem;
                            tsddi.Owner.Update();
                            scm.ShowContextMenu(tsddi.Owner, new System.Drawing.Point(0, 0));
                        };
                        tsdd.Items.Add(tsmiTest);

                        tsdd.Items.Add(new ToolStripSeparator());
                    }
                    else
                    {
                        //make a menuitem to show the last modified timestamp
                        var tsmiMissingFile = new ToolStripLabel { Text = "-Missing-" };
                        tsdd.Items.Add(tsmiMissingFile);
                        tsdd.Items.Add(new ToolStripSeparator());
                    }

                    //in either case, make a menuitem to let you remove the path
                    var tsmiRemovePath = new ToolStripMenuItem { Text = "&Remove" };
                    tsmiRemovePath.Click += (o, ev) => { recent.Remove(temp); };

                    tsdd.Items.Add(tsmiRemovePath);

                    ////experiment of popping open a submenu. doesnt work well.
                    //item.MouseDown += (o, mev) =>
                    //{
                    //  if (mev.Button != MouseButtons.Right) return;
                    //  //location of the menu containing this item that was just rightclicked
                    //  var pos = item.Owner.Bounds.Location;
                    //  //the offset within that menu of this item
                    //  var tsddi = item as ToolStripDropDownItem;
                    //  pos.Offset(tsddi.Bounds.Location);
                    //  //the offset of the click
                    //  pos.Offset(mev.Location);
                    //	//tsdd.OwnerItem = item; //has interesting promise, but breaks things otherwise
                    //  tsdd.Show(pos);
                    //};

                    //just add it to the submenu for now
                    item.MouseDown += (o, mev) =>
                    {
                        if (mev.Button != MouseButtons.Right) return;
                        if (item.DropDown != null)
                            item.DropDown = tsdd;
                        item.ShowDropDown();
                    };
                }
            }

            items.Add(new ToolStripSeparator());

            var clearitem = new ToolStripMenuItem { Text = "&Clear", Enabled = !recent.Frozen };
            clearitem.Click += (o, ev) => recent.Clear();
            items.Add(clearitem);

            var freezeitem = new ToolStripMenuItem { Text = recent.Frozen ? "&Unfreeze" : "&Freeze" };
            freezeitem.Click += (o, ev) => recent.Frozen ^= true;
            items.Add(freezeitem);

            if (autoload)
            {
                var auto = new ToolStripMenuItem { Text = "&Autoload", Checked = recent.AutoLoad };
                auto.Click += (o, ev) => recent.ToggleAutoLoad();
                items.Add(auto);
            }

            var settingsitem = new ToolStripMenuItem { Text = "&Recent Settings..." };
            settingsitem.Click += (o, ev) =>
            {
                using (var prompt = new InputPrompt
                {
                    TextInputType = InputPrompt.InputType.Unsigned,
                    Message = "Number of recent files to track",
                    InitialValue = recent.MAX_RECENT_FILES.ToString()
                })
                {
                    var result = prompt.ShowDialog();
                    if (result == DialogResult.OK)
                    {
                        int val = int.Parse(prompt.PromptText);
                        if (val > 0)
                            recent.MAX_RECENT_FILES = val;
                    }
                }
            };
            items.Add(settingsitem);

            return items.ToArray();
        }