Search code examples
visual-studio-2010mefvisual-studio-extensions

Visual Studio Editor Extension Options Dialog


I have a simple Visual Studio extension that is built in a similar manner as the one presented in this walkthrough (using the IWpfTextViewCreationListener interface).

The extension uses two colors that I'd like to make configurable.

How can I define an Options Dialog for this extension? (for example, a properties page that would appear in the Tools/Options menu)

I have tried to do this using the DialogPage Class, but apparently it requires a VSPackage and I'm not sure if this approach is compatible with what I'm doing.


Solution

  • I think you can make your colors customisable without providing a custom OptionsPage. You can Export your own colors and they will became configurable from Tools-Options-Fonts and Colors

    By your linked example:

    [Export(typeof(EditorFormatDefinition))]
    [Name("EditorFormatDefinition/MyCustomFormatDefinition")]
    [UserVisible(true)]
    internal class CustomFormatDefinition : EditorFormatDefinition
    {
      public CustomFormatDefinition( )
      {
        this.BackgroundColor = Colors.LightPink;
        this.ForegroundColor = Colors.DarkBlue;
        this.DisplayName = "My Cusotum Editor Format";
      }
    }
    
    [Export(typeof(EditorFormatDefinition))]
    [Name("EditorFormatDefinition/MyCustomFormatDefinition2")]
    [UserVisible(true)]
    internal class CustomFormatDefinition2 : EditorFormatDefinition
    {
      public CustomFormatDefinition2( )
      {
        this.BackgroundColor = Colors.DeepPink;
        this.ForegroundColor = Colors.DarkBlue;
        this.DisplayName = "My Cusotum Editor Format 2";
      }
    }
    
    [Export(typeof(IWpfTextViewCreationListener))]
    [ContentType("text")]
    [TextViewRole(PredefinedTextViewRoles.Document)]
    internal class TestViewCreationListener : IWpfTextViewCreationListener
    {
      [Import]
      internal IEditorFormatMapService FormatMapService = null;
    
      public void TextViewCreated( IWpfTextView textView )
      {
        IEditorFormatMap formatMap = FormatMapService.GetEditorFormatMap(textView);
    
        ResourceDictionary selectedText = formatMap.GetProperties("Selected Text");
        ResourceDictionary inactiveSelectedText = formatMap.GetProperties("Inactive Selected Text");
    
        ResourceDictionary myCustom = formatMap.GetProperties("EditorFormatDefinition/MyCustomFormatDefinition");
        ResourceDictionary myCustom2 = formatMap.GetProperties("EditorFormatDefinition/MyCustomFormatDefinition2");
    
        formatMap.BeginBatchUpdate();
    
        selectedText[EditorFormatDefinition.BackgroundBrushId] = myCustom[EditorFormatDefinition.BackgroundBrushId];
        formatMap.SetProperties("Selected Text", selectedText);
    
        inactiveSelectedText[EditorFormatDefinition.BackgroundBrushId] = myCustom2[EditorFormatDefinition.BackgroundBrushId];
        formatMap.SetProperties("Inactive Selected Text", myCustom2);
    
        formatMap.EndBatchUpdate();
      }
    }
    

    Custom EFDs can provide SolidColorBrushes.

    If this isn't enought, you can also access to the service provider used by VSPackages. You can make a package for the option page, and communicate with the Editor Extension through the service provider with a custom service.

    You can import the service provider like this:

    [Import]
    internal SVsServiceProvider serviceProvider = null;
    

    This soulution also doesn't require from you to migrate the original logic, only the creation of an additional package.