protected override ContextMenuStrip CreateMenu()
        {
            this.RefreshPresetList();

            ContextMenuStrip menu = new ContextMenuStrip();

            ToolStripMenuItem fileConverterItem = new ToolStripMenuItem
            {
                Text  = "File Converter",
                Image = Properties.Resources.ApplicationIcon_16x16.ToBitmap(),
            };

            for (int index = 0; index < this.presetList.Count; index++)
            {
                PresetDefinition preset = this.presetList[index];

                ToolStripMenuItem subItem = new ToolStripMenuItem
                {
                    Text    = preset.Name,
                    Enabled = preset.Enabled
                };

                fileConverterItem.DropDownItems.Add(subItem);
                subItem.Click += (sender, args) => this.ConvertFiles(preset.Name);
            }

            if (this.presetList.Count > 0)
            {
                fileConverterItem.DropDownItems.Add(new ToolStripSeparator());
            }

            {
                ToolStripMenuItem subItem = new ToolStripMenuItem
                {
                    Text = "Configure presets...",
                };

                fileConverterItem.DropDownItems.Add(subItem);
                subItem.Click += (sender, args) => this.OpenSettings();
            }

            menu.Items.Add(fileConverterItem);

            return(menu);
        }
        private void RefreshPresetList()
        {
            // Retrieve selected files extensions.
            List <string> extensions = new List <string>();

            foreach (string filePath in this.SelectedItemPaths)
            {
                string extension = Path.GetExtension(filePath);
                if (string.IsNullOrEmpty(extension))
                {
                    continue;
                }

                extension = extension.Substring(1).ToLowerInvariant();
                if (extensions.Contains(extension))
                {
                    continue;
                }

                extensions.Add(extension);
            }

            // Compute preset list.
            this.presetList.Clear();
            RegistryKey fileConverterKey = this.FileConverterRegistryKey;

            for (int extensionIndex = 0; extensionIndex < extensions.Count; extensionIndex++)
            {
                string      extension    = extensions[extensionIndex];
                RegistryKey extensionKey = fileConverterKey.OpenSubKey(extension);
                if (extensionKey == null)
                {
                    continue;
                }

                string presetsString = extensionKey.GetValue("Presets") as string;
                if (presetsString == null)
                {
                    continue;
                }

                string[] presets = presetsString.Split(';');

                for (int presetIndex = 0; presetIndex < presets.Length; presetIndex++)
                {
                    string           presetName       = presets[presetIndex];
                    PresetDefinition presetDefinition = this.presetList.FirstOrDefault(match => match.Name == presetName);
                    if (presetDefinition == null)
                    {
                        presetDefinition = new PresetDefinition(presetName);
                        this.presetList.Add(presetDefinition);
                    }

                    presetDefinition.ExtensionRefCount++;
                }
            }

            // Update enable states.
            for (int index = 0; index < this.presetList.Count; index++)
            {
                this.presetList[index].Enabled = this.presetList[index].ExtensionRefCount == extensions.Count;
            }
        }