ToolStripPanel UIAdapter






3.62/5 (5 votes)
Adding ToolStripPanel support to the Composite UI Application Block.
Introduction
I was very suppressed to find that CAB (Composite Application Block) did not support a higher level of the ToolStrip
in its basic implementation. I resolved to solve this, and I added an adapter and factory for the ToolStripPanel
initially, but I have been having trouble with the ToolStripContainer
. So, as my first post, here is the ToolStripPanel
code.
There are two parts to this. And two ways to do it. The first is to edit the existing ToolStrip
UI factory to include the new code. But I do not like to do this as I may update CAB in the future and do not want to rely on having to implement the adaptations again.
The second is to inherit from the current classes in your own assembly and to adapt the class to support both. That way, you are extending, not replacing.
Here is the code for the new ToolStripUIAdapterFactory
factory:
Public Class ToolStripPanelUIAdapter : _
Inherits UIElementAdapter(Of ToolStrip)
Private innerToolStripPanel As ToolStripPanel
Public Sub New(ByVal objToolStripPanel As ToolStripPanel)
Guard.ArgumentNotNull(objToolStripPanel, "objToolStripPanel")
Me.innerToolStripPanel = objToolStripPanel
End Sub
Protected Overrides Function Add(ByVal uiElement As ToolStrip) _
As ToolStrip
If Me.innerToolStripPanel Is Nothing Then
Throw New InvalidOperationException()
End If
Me.innerToolStripPanel.Join(uiElement, 3)
Return uiElement
End Function
Protected Overrides Sub Remove(ByVal uiElement As ToolStrip)
If Me.innerToolStripPanel.Controls.Contains(uiElement) Then
Me.innerToolStripPanel.Controls.Remove(uiElement)
End If
End Sub
End Class
As you can see, it inherits from the CAB class of the same name and overrides the same methods that it does, and adds the support for the new Adapter for the ToolStripPanel
.
You can now add the factory to the UI Element Adapter Factory Catalog in the AfterShellCreated
part of the main shell application:
Dim catalog As IUIElementAdapterFactoryCatalog = _
RootWorkItem.Services.Get(Of IUIElementAdapterFactoryCatalog)()
catalog.RegisterFactory(New UIElements.ToolStripUIAdapterFactory())
The CAB framework will now handle ToolStripPanel
s as UI Extension Sites with the appropriate factory. Now all we need is the adapter...
Here is the code for the ToolStripPanel
Adapter:
Public Class ToolStripPanelUIAdapter : Inherits UIElementAdapter(Of ToolStrip)
Private innerToolStripPanel As ToolStripPanel
Public Sub New(ByVal objToolStripPanel As ToolStripPanel)
Guard.ArgumentNotNull(objToolStripPanel, "objToolStripPanel")
Me.innerToolStripPanel = objToolStripPanel
End Sub
Protected Overrides Function Add(ByVal uiElement As ToolStrip) _
As ToolStrip
If Me.innerToolStripPanel Is Nothing Then
Throw New InvalidOperationException()
End If
Me.innerToolStripPanel.Join(uiElement, 3)
Return uiElement
End Function
Protected Overrides Sub Remove(ByVal uiElement As ToolStrip)
If Me.innerToolStripPanel.Controls.Contains(uiElement) Then
Me.innerToolStripPanel.Controls.Remove(uiElement)
End If
End Sub
End Class
This provides the functionality to allow you to register a site that is of type ToolStripPanel
:
RootWorkItem.UIExtensionSites.RegisterSite("MainToolStripPanelSiteName",
Me.Shell.InnerToolStripContainer.TopToolStripPanel)
This code registers the top panel, but you can register another or all of them, but only on separate sites. Once you have registered the site, you can create and add ToolStrip
s to it:
Dim objToolStip As New System.Windows.Forms.ToolStrip
LocalWorkItem.UIExtensionSites("MainToolStripPanelSiteName").Add(objToolStip)
LocalWorkItem.UIExtensionSites.RegisterSite("MyCustomToolStripSitename", _
objToolStip)
Don't forget the second registration that allows you to add a button to the ToolStrip
.
All done... You should now be able to create dynamic tool strips and populate them. If you want to customise a command, you will need to create a command adapter for the ToolStripPanel
and add it to CAB.