Click here to Skip to main content
15,892,575 members
Articles / Desktop Programming / WPF

Reflection Studio - Part 1 - Introduction: Architecture and Design

Rate me:
Please Sign up or sign in to vote.
4.83/5 (23 votes)
22 Sep 2010GPL36 min read 60K   6.9K   111  
Reflection Studio is a "developer" application for assembly, database, performance, and code generation, written in C# under WPF 4.0.
<Fluent:RibbonWindow x:Class="ReflectionStudio.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:Fluent="clr-namespace:Fluent;assembly=Fluent"
    xmlns:ad="clr-namespace:AvalonDock;assembly=AvalonDock"
    xmlns:cmd="clr-namespace:ReflectionStudio.Classes"
    xmlns:Controls="clr-namespace:ReflectionStudio.Controls;assembly=ReflectionStudio.Controls"
    xmlns:UserControls="clr-namespace:ReflectionStudio.Components.UserControls"
    xmlns:converters="clr-namespace:ReflectionStudio.Components.Converters"
    ResizeMode="CanResizeWithGrip" Title="{Binding Title}" Height="600" Width="800"
    Loaded="OfficeWindow_Loaded" Closing="OfficeWindow_Closing" Drop="OfficeWindow_Drop"
    Icon="Resources\Images\16x16\ReflectionStudio.png">
    <Fluent:RibbonWindow.Resources>

        <converters:DockStateToBooleanConverter x:Key="DockStateToBooleanConverter"/>

        <DataTemplate x:Key="largeDataItemTemplate">
            <Border ToolTip="{Binding Name}">
                <StackPanel Orientation="Vertical">
                    <Image Source="Resources\Images\32x32\stop_capture.png" Stretch="UniformToFill"/>
                    <TextBlock Text="{Binding Path=Name, Mode=OneWay}" FontSize="10" VerticalAlignment="Center"/>
                </StackPanel>
            </Border>
        </DataTemplate>
        
    </Fluent:RibbonWindow.Resources>
    
    <Grid Name="MainGrid">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <!--#################################################################################################-->
        <!--RIBBON CONTROL-->
        <Fluent:Ribbon Grid.Row="0" HorizontalAlignment="Stretch" Name="ribbonMain" AutomaticStateManagement="True"
                       IsBackstageOpen="True" Title="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=Title}">

            <!--#################################################################################################-->
            <!--Quick Access Toolbar Items-->
            <Fluent:Ribbon.QuickAccessItems>
                <Fluent:QuickAccessMenuItem Target="{Binding ElementName=btnNewProject}" IsChecked="True"/>
                <Fluent:QuickAccessMenuItem Target="{Binding ElementName=btnOpenProject}" IsChecked="True"/>
                <Fluent:QuickAccessMenuItem Target="{Binding ElementName=btnSaveproject}" IsChecked="True"/>
                <Fluent:QuickAccessMenuItem Target="{Binding ElementName=btnCloseProject}" IsChecked="True"/>
            </Fluent:Ribbon.QuickAccessItems>

            <Fluent:Ribbon.ToolBarItems>
                <Fluent:Button Size="Small" Icon="Resources\Images\32x32\application\help.png">
                    <Fluent:Button.ToolTip>
                        <Fluent:ScreenTip
                            Title="Insert Chart"
                            Text="Insert a chart to illustarate and compare data. &#xa;&#xa;Bar, Pie, Line, Area and Surface are same of the available types."
                            Image="Resources\Images\32x32\application\help.png"
                            HelpTopic="http:\\fluent.codeplex.com"
                            DisableReason="Disable reason reason."
                            Width="190"
                            IsRibbonAligned ="True"/>
                    </Fluent:Button.ToolTip>
                </Fluent:Button>
            </Fluent:Ribbon.ToolBarItems>

            <!--#################################################################################################-->
            <!-- project tab -->

            <Fluent:RibbonTabItem Header="Project">
                <Fluent:RibbonGroupBox Header="Project" IsLauncherVisible="True" LauncherCommand="Open" >
                    <Fluent:Button Name="btnNewProject" Text="New" Icon="Resources\Images\32x32\new_project.png"
                                   LargeIcon="Resources\Images\32x32\new_project.png" />
                    <Fluent:Button Name="btnOpenProject" Text="Open" Icon="Resources\Images\32x32\folders\open_folder.png"
                                   LargeIcon="Resources\Images\32x32\folders\open_folder.png" />
                    <Fluent:Button Name="btnSaveproject" Text="Save" Icon="Resources\Images\32x32\save.png"
                                   LargeIcon="Resources\Images\32x32\save.png" />
                    <Fluent:Button Name="btnSaveAsProject" Text="Save as" Icon="Resources\Images\32x32\save.png"
                                   LargeIcon="Resources\Images\32x32\save.png" />
                    <Fluent:Button Name="btnCloseProject" Text="Close" Icon="Resources\Images\32x32\folders\close_folder.png"
                                   LargeIcon="Resources\Images\32x32\folders\close_folder.png" />
                </Fluent:RibbonGroupBox>

                <Fluent:RibbonGroupBox Header="Assemblies" >
                </Fluent:RibbonGroupBox>

                <Fluent:RibbonGroupBox Header="Snapshots" >
                    <Fluent:ToggleButton Name="btnConnected" Text="New" Icon="Resources\Images\32x32\connect.png"
                                   LargeIcon="Resources\Images\32x32\connect.png" />
                    <Fluent:ToggleButton Name="btnStartCapture" Text="Open" Icon="Resources\Images\32x32\start_capture.png"
                                   LargeIcon="Resources\Images\32x32\start_capture.png" />
                    <Fluent:ToggleButton Name="btnStopCapture" Text="Save" Icon="Resources\Images\32x32\stop_capture.png"
                                   LargeIcon="Resources\Images\32x32\stop_capture.png" />
                </Fluent:RibbonGroupBox>
                
                <Fluent:RibbonGroupBox Header="Themes" >
                    <Fluent:InRibbonGallery x:Name="inRibbonGallery" 
                                            ItemsSource ="{Binding Themes}"
                                            ItemTemplate="{StaticResource largeDataItemTemplate}"
                                            Text="Split" Fluent:KeyTip.Keys="S" GroupBy="Group" 
                                            ResizeMode="Both" MaxItemsInRow="3" MinItemsInRow="1" ItemWidth="40" ItemHeight="55" ItemsInRow="3">
                        <Fluent:InRibbonGallery.Filters>
                            <Fluent:GalleryGroupFilter Title="All" Groups="Skins,Colors" />
                            <Fluent:GalleryGroupFilter Title="Skins" Groups="Skins"/>
                            <Fluent:GalleryGroupFilter Title="Colors" Groups="Colors"/>
                        </Fluent:InRibbonGallery.Filters>
                    </Fluent:InRibbonGallery>
                </Fluent:RibbonGroupBox>
                
                <Fluent:RibbonGroupBox Header="Help" >

                    <Fluent:Button Text="Home" Click="HomeButton_Click"
                                   Icon="Resources\Images\32x32\home.png" LargeIcon="Resources\Images\32x32\home.png" />
                    
                    <Fluent:DropDownButton Text="Help" Icon="Resources\Images\32x32\application\help.png"
                                   LargeIcon="Resources\Images\32x32\application\help.png">
                        <Fluent:MenuItem Text="User" Command="Help" CommandParameter="Help\ReflectionStudio.Help.xps"/>
                        <Fluent:MenuItem Text="Technical" Command="Help" CommandParameter="Help\ReflectionStudio.Technical.xps"/>
                    </Fluent:DropDownButton>

                    <Fluent:SplitButton Name="ThemeRibbonSplitButton" Text="Themes" Icon="Resources\Images\32x32\theme.png"
                                        LargeIcon="Resources\Images\32x32\theme.png"/>

                    <Fluent:DropDownButton Text="Explorers"
                                           Icon="Resources\Images\16x16\Application\increase_ident.png"
                                           LargeIcon="Resources\Images\16x16\Application\increase_ident.png">
                        <Fluent:Gallery ItemsSource ="{Binding Panels}" Orientation="Vertical">
                            <Fluent:Gallery.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel>
                                        <CheckBox Content="{Binding Title}"
                                          IsChecked="{Binding Path=State, Mode=OneWay,Converter={StaticResource DockStateToBooleanConverter}}"
                                        Click="ShowExplorerMenuItem_Click">
                                        </CheckBox>
                                    </StackPanel>
                                </DataTemplate>
                            </Fluent:Gallery.ItemTemplate>
                        </Fluent:Gallery>
                    </Fluent:DropDownButton>

                    <Fluent:Button Text="About" Icon="Resources\Images\32x32\reflection_studio.png"
                                   LargeIcon="Resources\Images\32x32\reflection_studio.png" Click="AboutButton_Click" />
                    
                </Fluent:RibbonGroupBox>
            </Fluent:RibbonTabItem>


            <!--#################################################################################################-->
            <!-- Contextual Tabs -->

            <Fluent:RibbonTabItem Header="SQL Query" Group="{Binding ElementName=SyntaxedDocumentGroup}" Name="ribbonTabSQLQuery">
                <Fluent:RibbonGroupBox Header="File" IsLauncherVisible="False" >
                    <Fluent:Button Text="Save" Icon="Resources\Images\32x32\save.png"
                                   LargeIcon="Resources\Images\32x32\save.png" />
                    <Fluent:Button Text="Save as" Icon="Resources\Images\32x32\save.png"
                                   LargeIcon="Resources\Images\32x32\save.png" />
                    <Fluent:Button Text="Close" Icon="Resources\Images\16x16\folders\close_folder.png"
                                   LargeIcon="Resources\Images\32x32\folders\close_folder.png" />
                </Fluent:RibbonGroupBox>

                <Fluent:RibbonGroupBox Header="Data source" IsLauncherVisible="False" >
                    <Fluent:Button Text="Add new" Icon="Resources\Images\32x32\save.png"
                                   LargeIcon="Resources\Images\32x32\save.png" />
                    <Fluent:Button Text="Change" Icon="Resources\Images\32x32\save.png"
                                   LargeIcon="Resources\Images\32x32\save.png" />
                    <Fluent:Button Text="Remove" Icon="Resources\Images\32x32\save.png"
                                   LargeIcon="Resources\Images\32x32\save.png" />

                    <Fluent:Button Text="Check Quality" Icon="Resources\Images\32x32\save.png"
                                   LargeIcon="Resources\Images\32x32\save.png" />
                </Fluent:RibbonGroupBox>
                
                <Fluent:RibbonGroupBox Header="Query" IsLauncherVisible="False" >
                    <Fluent:Button Text="Check" Icon="Resources\Images\32x32\save.png"
                                   Command="{x:Static UserControls:QueryDocument.CheckQuery}" LargeIcon="Resources\Images\32x32\save.png" />
                    <Fluent:Button Text="Execute" Icon="Resources\Images\32x32\save.png"
                                   Command="{x:Static UserControls:QueryDocument.ExecuteQuery}" LargeIcon="Resources\Images\32x32\save.png" />
                    <Fluent:Button Text="Stop" Icon="Resources\Images\32x32\save.png"
                                   Command="{x:Static UserControls:QueryDocument.StopExecuteQuery}" LargeIcon="Resources\Images\32x32\save.png" />
                </Fluent:RibbonGroupBox>
                
            </Fluent:RibbonTabItem>

            <Fluent:RibbonTabItem Header="Template" Group="{Binding ElementName=SyntaxedDocumentGroup}" Name="ribbonTabTemplate">
                <Fluent:RibbonGroupBox Header="File" IsLauncherVisible="False" >
                    <Fluent:Button Text="Save" Icon="Resources\Images\32x32\save.png"
                                   LargeIcon="Resources\Images\32x32\save.png" />
                    <Fluent:Button Text="Save as" Icon="Resources\Images\32x32\save.png"
                                   LargeIcon="Resources\Images\32x32\save.png" />
                    <Fluent:Button Text="Close" Icon="Resources\Images\16x16\folders\close_folder.png"
                                   LargeIcon="Resources\Images\32x32\folders\close_folder.png" />
                </Fluent:RibbonGroupBox>
                
            </Fluent:RibbonTabItem>

            <Fluent:RibbonTabItem Header="Text Editor" Group="{Binding ElementName=SyntaxedDocumentGroup}" Name="ribbonTabEditor">
                <Fluent:RibbonGroupBox Header="Clipboard" IsLauncherVisible="False" >
                    <Fluent:Button Text="Cut" Icon="Resources\Images\16x16\application\cut.png"
                                   Command="Cut" LargeIcon="Resources\Images\16x16\application\cut.png" />
                    <Fluent:Button Text="Copy" Icon="Resources\Images\16x16\application\copy.png"
                                   Command="Copy" LargeIcon="Resources\Images\16x16\application\copy.png" />
                    <Fluent:Button Text="Paste" Icon="Resources\Images\16x16\application\paste.png"
                                   Command="Paste" LargeIcon="Resources\Images\16x16\application\paste.png" />
                </Fluent:RibbonGroupBox>

                <Fluent:RibbonGroupBox Header="Clipboard" IsLauncherVisible="False" >
                    <Fluent:Button Text="Undo" Icon="Resources\Images\16x16\application\undo.png"
                                   Command="Undo" LargeIcon="Resources\Images\16x16\application\undo.png" />
                    <Fluent:Button Text="Redo" Icon="Resources\Images\16x16\application\redo.png"
                                   Command="Redo" LargeIcon="Resources\Images\16x16\application\redo.png" />

                    <Fluent:Button Text="Comment" Icon="Resources\Images\16x16\application\comment.png"
                                   Command="Paste" LargeIcon="Resources\Images\16x16\application\comment.png" />
                    <Fluent:Button Text="Uncomment" Icon="Resources\Images\16x16\application\uncomment.png"
                                   Command="Paste" LargeIcon="Resources\Images\16x16\application\uncomment.png" />

                    <Fluent:Button Text="Increase identation" Icon="Resources\Images\16x16\application\increase_ident.png"
                                   Command="Paste" LargeIcon="Resources\Images\16x16\application\increase_ident.png" />
                    <Fluent:Button Text="Decrease identation" Icon="Resources\Images\16x16\application\decrease_ident.png"
                                   Command="Paste" LargeIcon="Resources\Images\16x16\application\increase_ident.png" />
                </Fluent:RibbonGroupBox>

                
            </Fluent:RibbonTabItem>

            <!--Contextual Tab Groups-->
            <Fluent:Ribbon.ContextualGroups>
                <Fluent:RibbonContextualTabGroup Header="Documents" Visibility="Collapsed"  x:Name="SyntaxedDocumentGroup" Background="Red" BorderBrush="Red" />
            </Fluent:Ribbon.ContextualGroups>
            
            <!--#################################################################################################-->
            <!--Backstage Items-->

            <Fluent:Ribbon.BackstageItems>
                <Fluent:BackstageTabItem Header="New" Fluent:KeyTip.Keys="N">
                    <Fluent:BackstageTabControl  Margin="20,5,20,5" ItemsSource="{Binding Workspace.RecentFiles}">
                        <Fluent:BackstageTabControl.ItemTemplate>
                            <DataTemplate>
                                <TabItem Header="{Binding FullName}"></TabItem>
                            </DataTemplate>
                        </Fluent:BackstageTabControl.ItemTemplate>
                    </Fluent:BackstageTabControl>
                </Fluent:BackstageTabItem>
                
                <Fluent:BackstageTabItem Header="Open"/>
                <Fluent:BackstageTabItem Header="Save"/>
                <Fluent:BackstageTabItem Header="Save as" />

                <Fluent:BackstageTabItem Header="Info" />

                <Fluent:BackstageTabItem Header="Recent" Fluent:KeyTip.Keys="R">
                    
                    <Fluent:BackstageTabControl  Margin="20,5,20,5" ItemsSource="{Binding Workspace.RecentFiles}"
                                                 SelectionChanged="RecentFilesTabControl_SelectionChanged">
                        <Fluent:BackstageTabControl.ItemTemplate>
                            <DataTemplate>
                                <TabItem Header="{Binding FullName}"></TabItem>
                            </DataTemplate>
                        </Fluent:BackstageTabControl.ItemTemplate>
                    </Fluent:BackstageTabControl>
                    
                </Fluent:BackstageTabItem>

                <Fluent:BackstageTabItem Header="Print" Fluent:KeyTip.Keys="P">
                </Fluent:BackstageTabItem>

                <Fluent:Button Text="Exit" Icon="Resources\Images\32x32\exit.png"
                               LargeIcon="Resources\Images\32x32\exit.png" Click="ExitButton_Click"/>
            </Fluent:Ribbon.BackstageItems>

        </Fluent:Ribbon>    

        <!--#################################################################################################-->
        <!--CONTENT-->
        <ad:DockingManager Grid.Row="1" x:Name="_dockingManager" Loaded="_dockingManager_Loaded" Background="{DynamicResource DefaultBorderBrush}">
                <ad:ResizingPanel Orientation="Vertical">
                    <ad:ResizingPanel Orientation="Horizontal">
                        <ad:ResizingPanel Orientation="Vertical" ad:ResizingPanel.ResizeWidth="200">

                            <!--#################################################################################################-->
                            <!--LEFT PART-->
                            <ad:DockablePane>

                                <!--#################################################################################################-->
                                <!--ASSEMBLY EXPLORER -->
                                <UserControls:AssemblyExplorer x:Name="_DllExplorerDock" />

                                <!--#################################################################################################-->
                                <!--DATABASE EXPLORER -->
                                <UserControls:DatabaseExplorer x:Name="_DBExplorerDock" />

                                <!--#################################################################################################-->
                                <!--DATABASE EXPLORER -->
                                <UserControls:TemplateExplorer x:Name="_TemplateExplorerDock" />

                            </ad:DockablePane>
                        
                        </ad:ResizingPanel>

                        <!--#################################################################################################-->
                        <!--CENTER PART-->
                        <ad:DocumentPane x:Name="_documentsHost">

                            <!--<UserControls:AssemblyDiagramViewer Title="test"></UserControls:AssemblyDiagramViewer>
                            <UserControls:HomeDocument Closed="DocumentClosed" Closing="DocumentClosing"></UserControls:HomeDocument>-->

                        </ad:DocumentPane>

                        <ad:ResizingPanel Orientation="Vertical" ad:ResizingPanel.ResizeWidth="200">

                            <!--#################################################################################################-->
                            <!--RIGHT PART-->
                            <ad:DockablePane>

                                <!--#################################################################################################-->
                                <!--PROJECT EXPLORER-->
                                <UserControls:ProjectExplorer x:Name="_ProjectExplorerDock" />

                                <!--#################################################################################################-->
                                <!--PROPERTY EXPLORER-->
                                <UserControls:PropertyExplorer x:Name="_PropertyExplorerDock" />

                            </ad:DockablePane>

                        </ad:ResizingPanel>
                    </ad:ResizingPanel>

                    <ad:ResizingPanel Orientation="Horizontal">

                        <!--#################################################################################################-->
                        <!--LOGS EXPLORER-->
                        <ad:DockablePane>
                            <UserControls:EventLogExplorer x:Name="_LogExplorerDock" />
                        </ad:DockablePane>
                    </ad:ResizingPanel>

                </ad:ResizingPanel>
                
            </ad:DockingManager>

        <!--#################################################################################################-->
        <!--STATUS BAR-->    
        <UserControls:StatusBar Grid.Row="2" x:Name="MainStatusBar" />
        
    </Grid>

</Fluent:RibbonWindow>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


Written By
Architect
France France
WPF and MVVM fan, I practice C # in all its forms from the beginning of the NET Framework without mentioning C ++ / MFC and other software packages such as databases, ASP, WCF, Web & Windows services, Application, and now Core and UWP.
In my wasted hours, I am guilty of having fathered C.B.R. and its cousins C.B.R. for WinRT and UWP on the Windows store.
But apart from that, I am a great handyman ... the house, a rocket stove to heat the jacuzzi and the last one: a wood oven for pizza, bread, and everything that goes inside

https://guillaumewaser.wordpress.com/
https://fouretcompagnie.wordpress.com/

Comments and Discussions