Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3575 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
13 changed files with 400 additions and 81 deletions
@ -0,0 +1,94 @@
@@ -0,0 +1,94 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <author name="Daniel Grunwald"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using System.Windows; |
||||
using System.Windows.Controls; |
||||
using System.Windows.Controls.Primitives; |
||||
using System.Windows.Input; |
||||
using System.Windows.Media; |
||||
using System.Windows.Shapes; |
||||
|
||||
namespace ICSharpCode.Core.Presentation |
||||
{ |
||||
/// <summary>
|
||||
/// A button with drop-down menu.
|
||||
/// </summary>
|
||||
public class SplitButton : ButtonBase |
||||
{ |
||||
public static readonly DependencyProperty DropDownMenuProperty |
||||
= DependencyProperty.Register("DropDownMenu", typeof(ContextMenu), |
||||
typeof(SplitButton), new FrameworkPropertyMetadata(null)); |
||||
|
||||
protected static readonly DependencyPropertyKey IsDropDownMenuOpenPropertyKey |
||||
= DependencyProperty.RegisterReadOnly("IsDropDownMenuOpen", typeof(bool), |
||||
typeof(SplitButton), new FrameworkPropertyMetadata(false)); |
||||
|
||||
public static readonly DependencyProperty IsDropDownMenuOpenProperty = IsDropDownMenuOpenPropertyKey.DependencyProperty; |
||||
|
||||
static SplitButton() |
||||
{ |
||||
DefaultStyleKeyProperty.OverrideMetadata(typeof(SplitButton), new FrameworkPropertyMetadata(typeof(SplitButton))); |
||||
} |
||||
|
||||
public ContextMenu DropDownMenu { |
||||
get { return (ContextMenu)GetValue(DropDownMenuProperty); } |
||||
set { SetValue(DropDownMenuProperty, value); } |
||||
} |
||||
|
||||
public bool IsDropDownMenuOpen { |
||||
get { return (bool)GetValue(IsDropDownMenuOpenProperty); } |
||||
protected set { SetValue(IsDropDownMenuOpenPropertyKey, value); } |
||||
} |
||||
|
||||
FrameworkElement dropDownButton; |
||||
|
||||
public override void OnApplyTemplate() |
||||
{ |
||||
base.OnApplyTemplate(); |
||||
dropDownButton = (FrameworkElement)Template.FindName("PART_DropDownButton", this); |
||||
} |
||||
|
||||
bool IsOverDropDownButton(MouseEventArgs e) |
||||
{ |
||||
if (dropDownButton == null) |
||||
return false; |
||||
return e.GetPosition(dropDownButton).X >= 0; |
||||
} |
||||
|
||||
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) |
||||
{ |
||||
if (IsOverDropDownButton(e)) { |
||||
e.Handled = true; |
||||
if (DropDownMenu != null) { |
||||
DropDownMenu.Placement = PlacementMode.Bottom; |
||||
DropDownMenu.PlacementTarget = this; |
||||
DropDownMenu.IsOpen = true; |
||||
DropDownMenu.Closed += DropDownMenu_Closed; |
||||
this.IsDropDownMenuOpen = true; |
||||
} |
||||
} else { |
||||
base.OnMouseLeftButtonDown(e); |
||||
} |
||||
} |
||||
|
||||
void DropDownMenu_Closed(object sender, RoutedEventArgs e) |
||||
{ |
||||
((ContextMenu)sender).Closed -= DropDownMenu_Closed; |
||||
this.IsDropDownMenuOpen = false; |
||||
} |
||||
|
||||
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e) |
||||
{ |
||||
if (!IsMouseCaptured && IsOverDropDownButton(e)) { |
||||
e.Handled = true; |
||||
} else { |
||||
base.OnMouseLeftButtonUp(e); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,65 @@
@@ -0,0 +1,65 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <author name="Daniel Grunwald"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using System.Collections; |
||||
using System.Windows; |
||||
using System.Windows.Controls; |
||||
|
||||
namespace ICSharpCode.Core.Presentation |
||||
{ |
||||
/// <summary>
|
||||
/// A tool bar button based on the AddIn-tree.
|
||||
/// </summary>
|
||||
sealed class ToolBarSplitButton : SplitButton, IStatusUpdate |
||||
{ |
||||
ICommand menuCommand; |
||||
object caller; |
||||
Codon codon; |
||||
|
||||
public ToolBarSplitButton(Codon codon, object caller, IList submenu) |
||||
{ |
||||
ToolTipService.SetShowOnDisabled(this, true); |
||||
|
||||
this.codon = codon; |
||||
this.caller = caller; |
||||
|
||||
if (codon.Properties.Contains("icon")) { |
||||
var image = PresentationResourceService.GetImage(StringParser.Parse(codon.Properties["icon"])); |
||||
image.Height = 16; |
||||
image.SetResourceReference(StyleProperty, ToolBarService.ImageStyleKey); |
||||
this.Content = new PixelSnapper(image); |
||||
} |
||||
|
||||
menuCommand = (ICommand)codon.AddIn.CreateObject(codon.Properties["class"]); |
||||
menuCommand.Owner = this; |
||||
|
||||
this.Command = new CommandWrapper(codon, caller, menuCommand); |
||||
this.DropDownMenu = MenuService.CreateContextMenu(submenu); |
||||
|
||||
UpdateText(); |
||||
} |
||||
|
||||
public void UpdateText() |
||||
{ |
||||
if (codon.Properties.Contains("label")){ |
||||
this.Content = StringParser.Parse(codon.Properties["label"]); |
||||
} |
||||
if (codon.Properties.Contains("tooltip")) { |
||||
this.ToolTip = StringParser.Parse(codon.Properties["tooltip"]); |
||||
} |
||||
} |
||||
|
||||
public void UpdateStatus() |
||||
{ |
||||
if (codon.GetFailedAction(caller) == ConditionFailedAction.Exclude) |
||||
this.Visibility = Visibility.Collapsed; |
||||
else |
||||
this.Visibility = Visibility.Visible; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,81 @@
@@ -0,0 +1,81 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
||||
xmlns:local="clr-namespace:ICSharpCode.Core.Presentation" |
||||
> |
||||
<Style TargetType="{x:Type local:SplitButton}"> |
||||
<Setter Property="TextElement.Foreground" Value = "{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" /> |
||||
<Setter Property="Control.Padding" Value="2,2,2,2"/> |
||||
<Setter Property="Border.BorderThickness" Value="1,1,1,1"/> |
||||
<Setter Property="Panel.Background" Value="Transparent"/> |
||||
<Setter Property="Border.BorderBrush" Value="Transparent"/> |
||||
<Setter Property="FrameworkElement.HorizontalAlignment" Value="Center"/> |
||||
<Setter Property="FrameworkElement.VerticalAlignment" Value="Center"/> |
||||
<Setter Property="Control.HorizontalContentAlignment" Value="Center"/> |
||||
<Setter Property="Control.VerticalContentAlignment" Value="Center"/> |
||||
<Setter Property="Template"> |
||||
<Setter.Value> |
||||
<ControlTemplate TargetType="local:SplitButton" |
||||
xmlns:s="clr-namespace:System;assembly=mscorlib"> |
||||
<Border |
||||
BorderThickness="{TemplateBinding Border.BorderThickness}" |
||||
BorderBrush="{TemplateBinding Border.BorderBrush}" |
||||
Background="{TemplateBinding Panel.Background}" |
||||
Name="OuterBorder" |
||||
SnapsToDevicePixels="True" |
||||
> |
||||
<StackPanel Orientation="Horizontal"> |
||||
<ContentPresenter |
||||
Margin="{TemplateBinding Control.Padding}" |
||||
Content="{TemplateBinding ContentControl.Content}" |
||||
ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" |
||||
ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" |
||||
HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" |
||||
VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" |
||||
SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> |
||||
<Border |
||||
Name="PART_DropDownButton" |
||||
BorderThickness="1,0,0,0" |
||||
BorderBrush="{Binding ElementName=OuterBorder, Path=BorderBrush}" |
||||
SnapsToDevicePixels="True" |
||||
> |
||||
<Path Margin="2" |
||||
Data = "M0,0 L1,0 0.5,1 z" |
||||
Fill = "{TemplateBinding TextElement.Foreground}" |
||||
Width = "7" |
||||
Height = "3.5" |
||||
Stretch = "Fill"/> |
||||
</Border> |
||||
</StackPanel> |
||||
</Border> |
||||
<ControlTemplate.Triggers> |
||||
<Trigger Property="UIElement.IsMouseOver" Value="True"> |
||||
<Setter Property="Border.BorderBrush" TargetName="OuterBorder" Value="#FF3399FF" /> |
||||
<Setter Property="Panel.Background" TargetName="OuterBorder" Value="#FFC2E0FF"/> |
||||
<Setter Property="Panel.Background" TargetName="PART_DropDownButton" Value="#FFC2E0FF"/> |
||||
</Trigger> |
||||
<Trigger Property="UIElement.IsKeyboardFocused" Value="True"> |
||||
<Setter Property="Border.BorderBrush" TargetName="OuterBorder" Value="#FF3399FF"/> |
||||
<Setter Property="Panel.Background" TargetName="OuterBorder" Value="#FFC2E0FF"/> |
||||
<Setter Property="Panel.Background" TargetName="PART_DropDownButton" Value="#FFC2E0FF"/> |
||||
</Trigger> |
||||
<Trigger Property="ButtonBase.IsPressed" Value="True"> |
||||
<Setter Property="Border.BorderBrush" TargetName="OuterBorder" Value="#FF3399FF"/> |
||||
<Setter Property="Panel.Background" TargetName="OuterBorder" Value="#FF99CCFF"/> |
||||
</Trigger> |
||||
<Trigger Property="UIElement.IsEnabled" Value="False"> |
||||
<Setter Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> |
||||
</Trigger> |
||||
<Trigger Property="local:SplitButton.IsDropDownMenuOpen" Value="True"> |
||||
<Setter Property="Border.BorderBrush" TargetName="OuterBorder" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}" /> |
||||
<Setter Property="Border.BorderBrush" TargetName="PART_DropDownButton" Value="Transparent" /> |
||||
<Setter Property="Border.BorderThickness" TargetName="OuterBorder" Value="1,1,1,0" /> |
||||
<Setter Property="Border.Padding" TargetName="OuterBorder" Value="0,0,0,1" /> |
||||
<Setter Property="Panel.Background" TargetName="OuterBorder" Value="Transparent"/> |
||||
<Setter Property="Panel.Background" TargetName="PART_DropDownButton" Value="Transparent"/> |
||||
</Trigger> |
||||
</ControlTemplate.Triggers> |
||||
</ControlTemplate> |
||||
</Setter.Value> |
||||
</Setter> |
||||
</Style> |
||||
</ResourceDictionary> |
@ -0,0 +1,81 @@
@@ -0,0 +1,81 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
||||
xmlns:local="clr-namespace:ICSharpCode.Core.Presentation" |
||||
> |
||||
<Style TargetType="{x:Type local:SplitButton}"> |
||||
<Setter Property="TextElement.Foreground" Value = "{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" /> |
||||
<Setter Property="Control.Padding" Value="2,2,2,2"/> |
||||
<Setter Property="Border.BorderThickness" Value="1,1,1,1"/> |
||||
<Setter Property="Panel.Background" Value="Transparent"/> |
||||
<Setter Property="Border.BorderBrush" Value="Transparent"/> |
||||
<Setter Property="FrameworkElement.HorizontalAlignment" Value="Center"/> |
||||
<Setter Property="FrameworkElement.VerticalAlignment" Value="Center"/> |
||||
<Setter Property="Control.HorizontalContentAlignment" Value="Center"/> |
||||
<Setter Property="Control.VerticalContentAlignment" Value="Center"/> |
||||
<Setter Property="Template"> |
||||
<Setter.Value> |
||||
<ControlTemplate TargetType="local:SplitButton" |
||||
xmlns:s="clr-namespace:System;assembly=mscorlib"> |
||||
<Border |
||||
BorderThickness="{TemplateBinding Border.BorderThickness}" |
||||
BorderBrush="{TemplateBinding Border.BorderBrush}" |
||||
Background="{TemplateBinding Panel.Background}" |
||||
Name="OuterBorder" |
||||
SnapsToDevicePixels="True" |
||||
> |
||||
<StackPanel Orientation="Horizontal"> |
||||
<ContentPresenter |
||||
Margin="{TemplateBinding Control.Padding}" |
||||
Content="{TemplateBinding ContentControl.Content}" |
||||
ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" |
||||
ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" |
||||
HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" |
||||
VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" |
||||
SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> |
||||
<Border |
||||
Name="PART_DropDownButton" |
||||
BorderThickness="1,0,0,0" |
||||
BorderBrush="{Binding ElementName=OuterBorder, Path=BorderBrush}" |
||||
SnapsToDevicePixels="True" |
||||
> |
||||
<Path Margin="2" |
||||
Data = "M0,0 L1,0 0.5,1 z" |
||||
Fill = "{TemplateBinding TextElement.Foreground}" |
||||
Width = "7" |
||||
Height = "3.5" |
||||
Stretch = "Fill"/> |
||||
</Border> |
||||
</StackPanel> |
||||
</Border> |
||||
<ControlTemplate.Triggers> |
||||
<Trigger Property="UIElement.IsMouseOver" Value="True"> |
||||
<Setter Property="Border.BorderBrush" TargetName="OuterBorder" Value="#FF0A246A" /> |
||||
<Setter Property="Panel.Background" TargetName="OuterBorder" Value="#FFB6BDD2"/> |
||||
<Setter Property="Panel.Background" TargetName="PART_DropDownButton" Value="#FFB6BDD2"/> |
||||
</Trigger> |
||||
<Trigger Property="UIElement.IsKeyboardFocused" Value="True"> |
||||
<Setter Property="Border.BorderBrush" TargetName="OuterBorder" Value="#FF0A246A"/> |
||||
<Setter Property="Panel.Background" TargetName="OuterBorder" Value="#FFB6BDD2"/> |
||||
<Setter Property="Panel.Background" TargetName="PART_DropDownButton" Value="#FFB6BDD2"/> |
||||
</Trigger> |
||||
<Trigger Property="ButtonBase.IsPressed" Value="True"> |
||||
<Setter Property="Border.BorderBrush" TargetName="OuterBorder" Value="#FF0A246A"/> |
||||
<Setter Property="Panel.Background" TargetName="OuterBorder" Value="#FF8592B5"/> |
||||
</Trigger> |
||||
<Trigger Property="UIElement.IsEnabled" Value="False"> |
||||
<Setter Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> |
||||
</Trigger> |
||||
<Trigger Property="local:SplitButton.IsDropDownMenuOpen" Value="True"> |
||||
<Setter Property="Border.BorderBrush" TargetName="OuterBorder" Value="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}" /> |
||||
<Setter Property="Border.BorderBrush" TargetName="PART_DropDownButton" Value="Transparent" /> |
||||
<Setter Property="Border.BorderThickness" TargetName="OuterBorder" Value="1,1,1,0" /> |
||||
<Setter Property="Border.Padding" TargetName="OuterBorder" Value="0,0,0,1" /> |
||||
<Setter Property="Panel.Background" TargetName="OuterBorder" Value="Transparent"/> |
||||
<Setter Property="Panel.Background" TargetName="PART_DropDownButton" Value="Transparent"/> |
||||
</Trigger> |
||||
</ControlTemplate.Triggers> |
||||
</ControlTemplate> |
||||
</Setter.Value> |
||||
</Setter> |
||||
</Style> |
||||
</ResourceDictionary> |
Loading…
Reference in new issue