Browse Source

- MarkupExtension know loading as XamlObject: no difference between <Binding/> and {Binding} syntax.

- Support for NameScopes, Binding
- Remove TreeView dependency from PropertyGrid (now DataTemplates)
- Fixing Outline, XamlFormatter, ME Tokenizer/Parser
- Expremints with EnumBar

Broken: 
- BrushEditor (serialization still required)
- XamlObject.XmlElement must be always consistent
(in the case of ME it's detached from real Xml), during parsing too.

TODO: Designer Itself!

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3329 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Ivan Shumilin 17 years ago
parent
commit
d2b9992a47
  1. 10
      samples/XamlDesigner/App.xaml
  2. 2
      samples/XamlDesigner/Document.cs
  3. 3
      samples/XamlDesigner/DocumentView.xaml
  4. 2
      samples/XamlDesigner/NewFileTemplate.xaml
  5. 63
      samples/XamlDesigner/OutlineNode.cs
  6. 7
      samples/XamlDesigner/TestFiles/3.xaml
  7. 8
      samples/XamlDesigner/Themes/Generic.xaml
  8. 13
      samples/XamlDesigner/XamlDesigner.csproj
  9. 7
      samples/XamlDesigner/XamlFormatter.cs
  10. 46
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/ControlStyles.xaml
  11. 7
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/EnumBar.xaml
  12. 112
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/EnumBar.xaml.cs
  13. 26
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/EnumButton.cs
  14. 24
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Converters.cs
  15. 4
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs
  16. 12
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ExtensionMethods.cs
  17. 5
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs
  18. 19
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/BasicMetadata.cs
  19. 4
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/Editors/BrushEditor/BrushEditor.cs
  20. 6
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyContextMenu.xaml
  21. 202
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.xaml
  22. 26
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.xaml.cs
  23. 101
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyTreeView.cs
  24. 15
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj
  25. 37
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlModelProperty.cs
  26. 9
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/XamlDom/MarkupExtensionTests.cs
  27. 164
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionParser.cs
  28. 45
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs
  29. 4
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/WpfDesign.XamlDom.csproj
  30. 4
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlDocument.cs
  31. 52
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlMarkupValue.cs
  32. 170
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObject.cs
  33. 47
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObjectServiceProvider.cs
  34. 54
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs
  35. 259
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlProperty.cs
  36. 43
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlTextValue.cs
  37. 14
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlTypeResolverProvider.cs
  38. 19
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Metadata.cs
  39. 40
      src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs

10
samples/XamlDesigner/App.xaml

@ -9,15 +9,5 @@ @@ -9,15 +9,5 @@
<Converters:CollapsedWhenFalse x:Key="CollapsedWhenFalse" />
<Converters:FalseWhenZero x:Key="FalseWhenZero" />
<Style x:Key="TabButtonStyle"
TargetType="ToggleButton">
<Setter Property="Width"
Value="50" />
<Setter Property="ClickMode"
Value="Press" />
<Setter Property="Margin"
Value="3 3 0 3" />
</Style>
</Application.Resources>
</Application>

2
samples/XamlDesigner/Document.cs

@ -203,7 +203,7 @@ namespace ICSharpCode.XamlDesigner @@ -203,7 +203,7 @@ namespace ICSharpCode.XamlDesigner
OutlineRoot = null;
}
else {
OutlineRoot = new OutlineNode(DesignContext.RootItem);
OutlineRoot = OutlineNode.Create(DesignContext.RootItem);
}
UndoService.UndoStackChanged += new EventHandler(UndoService_UndoStackChanged);
}

3
samples/XamlDesigner/DocumentView.xaml

@ -5,10 +5,11 @@ @@ -5,10 +5,11 @@
xmlns:Integration="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:TextEditor="clr-namespace:ICSharpCode.TextEditor;assembly=ICSharpCode.TextEditor"
xmlns:Default="clr-namespace:ICSharpCode.XamlDesigner"
xmlns:DesignerControls="clr-namespace:ICSharpCode.WpfDesign.Designer.Controls;assembly=ICSharpCode.WpfDesign.Designer"
>
<DockPanel>
<Default:EnumBar Value="{Binding Mode}"
<DesignerControls:EnumBar Value="{Binding Mode}"
DockPanel.Dock="Bottom"/>
<Grid>
<Integration:WindowsFormsHost Visibility="{Binding InXamlMode, Converter={StaticResource CollapsedWhenFalse}}">

2
samples/XamlDesigner/NewFileTemplate.xaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
<Window xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas />
</Window>

63
samples/XamlDesigner/OutlineNode.cs

@ -6,26 +6,37 @@ using System.ComponentModel; @@ -6,26 +6,37 @@ using System.ComponentModel;
using ICSharpCode.WpfDesign;
using System.Collections.ObjectModel;
using System.Collections;
using ICSharpCode.WpfDesign.Designer;
namespace ICSharpCode.XamlDesigner
{
public class OutlineNode : INotifyPropertyChanged
{
public OutlineNode(DesignItem designItem)
public static OutlineNode Create(DesignItem designItem)
{
OutlineNode node;
if (!outlineNodes.TryGetValue(designItem, out node)) {
node = new OutlineNode(designItem);
outlineNodes[designItem] = node;
}
return node;
}
//TODO: Reset with DesignContext
static Dictionary<DesignItem, OutlineNode> outlineNodes = new Dictionary<DesignItem, OutlineNode>();
OutlineNode(DesignItem designItem)
{
DesignItem = designItem;
UpdateChildren();
//TODO (possible bug)
//TODO
DesignItem.NameChanged += new EventHandler(DesignItem_NameChanged);
DesignItem.PropertyChanged += new PropertyChangedEventHandler(DesignItem_PropertyChanged);
SelectionService.SelectionChanged += new EventHandler<DesignItemCollectionEventArgs>(Selection_SelectionChanged);
}
bool freezeChildren;
public DesignItem DesignItem { get; private set; }
public OutlineNode Parent { get; private set; }
public ISelectionService SelectionService {
get { return DesignItem.Services.Selection; }
@ -93,7 +104,6 @@ namespace ICSharpCode.XamlDesigner @@ -93,7 +104,6 @@ namespace ICSharpCode.XamlDesigner
void UpdateChildren()
{
if (freezeChildren) return;
if (DesignItem.ContentPropertyName != null) {
var content = DesignItem.ContentProperty;
if (content.IsCollection) {
@ -109,17 +119,13 @@ namespace ICSharpCode.XamlDesigner @@ -109,17 +119,13 @@ namespace ICSharpCode.XamlDesigner
void UpdateChildrenCore(IEnumerable<DesignItem> items)
{
var cache = Children.ToDictionary(n => n.DesignItem);
Children.Clear();
foreach (var item in items) {
OutlineNode node;
if (!cache.TryGetValue(item, out node)) {
node = new OutlineNode(item);
if (ModelTools.CanSelectComponent(item)) {
var node = OutlineNode.Create(item);
Children.Add(node);
}
Children.Add(node);
node.Parent = this;
}
}
@ -129,7 +135,7 @@ namespace ICSharpCode.XamlDesigner @@ -129,7 +135,7 @@ namespace ICSharpCode.XamlDesigner
if (DesignItem.ContentProperty.IsCollection) {
foreach (var node in nodes) {
if (!CanAdd(DesignItem.ContentProperty.ReturnType,
if (!CanCollectionAdd(DesignItem.ContentProperty.ReturnType,
node.DesignItem.ComponentType)) {
return false;
}
@ -143,7 +149,7 @@ namespace ICSharpCode.XamlDesigner @@ -143,7 +149,7 @@ namespace ICSharpCode.XamlDesigner
}
}
public static bool CanAdd(Type col, Type item)
static bool CanCollectionAdd(Type col, Type item)
{
var e = col.GetInterface("IEnumerable`1");
if (e != null && e.IsGenericType) {
@ -155,47 +161,26 @@ namespace ICSharpCode.XamlDesigner @@ -155,47 +161,26 @@ namespace ICSharpCode.XamlDesigner
public void Insert(IEnumerable<OutlineNode> nodes, OutlineNode after, bool copy)
{
freezeChildren = true;
if (copy) {
nodes = nodes.Select(n => new OutlineNode(n.DesignItem.Clone()));
nodes = nodes.Select(n => OutlineNode.Create(n.DesignItem.Clone()));
}
else {
foreach (var node in nodes) {
Remove(node);
node.DesignItem.Remove();
}
}
var index = after == null ? 0 : Children.IndexOf(after) + 1;
var tempIndex = index;
foreach (var node in nodes) {
Children.Insert(tempIndex++, node);
node.Parent = this;
}
var content = DesignItem.ContentProperty;
if (content.IsCollection) {
tempIndex = index;
foreach (var node in nodes) {
content.CollectionElements.Insert(tempIndex++, node.DesignItem);
content.CollectionElements.Insert(index++, node.DesignItem);
}
}
else {
content.SetValue(nodes.First().DesignItem);
}
freezeChildren = false;
}
void Remove(OutlineNode node)
{
node.DesignItem.Remove();
if (node.Parent != null) {
node.Parent.Children.Remove(node);
node.Parent = null;
}
}
#region INotifyPropertyChanged Members

7
samples/XamlDesigner/TestFiles/3.xaml

@ -7,5 +7,10 @@ @@ -7,5 +7,10 @@
<sys:String x:Key="r1">Title</sys:String>
<sys:String x:Key="r2">Width</sys:String>
</Window.Resources>
<TextBlock Text="{Binding Path={StaticResource r1}, ElementName=root}" />
<StackPanel>
<Button Name="b1"
Width="100"
Content="Button" />
<TextBlock Text="{Binding Path={StaticResource r1}, ElementName=root}" />
</StackPanel>
</Window>

8
samples/XamlDesigner/Themes/Generic.xaml

@ -21,14 +21,6 @@ @@ -21,14 +21,6 @@
</Setter>
</Style>
<Style TargetType="{x:Type Default:EnumButton}"
BasedOn="{StaticResource {x:Type ToggleButton}}">
<Setter Property="Margin"
Value="3 3 0 3" />
<Setter Property="MinWidth"
Value="50" />
</Style>
<Brush x:Key="InsertBrush">#FFC73C</Brush>
<Style x:Key="ExpandButtonStyle"

13
samples/XamlDesigner/XamlDesigner.csproj

@ -111,10 +111,6 @@ @@ -111,10 +111,6 @@
<Compile Include="DragListener.cs" />
<Compile Include="DragTreeView.cs" />
<Compile Include="DragTreeViewItem.cs" />
<Compile Include="EnumButton.cs" />
<Compile Include="EnumBar.xaml.cs">
<DependentUpon>EnumBar.xaml</DependentUpon>
</Compile>
<Compile Include="ExtensionMethods.cs" />
<Compile Include="IconItem.cs" />
<Compile Include="MainWindow_Commands.cs" />
@ -148,10 +144,6 @@ @@ -148,10 +144,6 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="EnumBar.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="MainWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
@ -166,10 +158,9 @@ @@ -166,10 +158,9 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="TestFiles\3.xaml">
<Generator>MSBuild:Compile</Generator>
<None Include="TestFiles\3.xaml">
<SubType>Designer</SubType>
</Page>
</None>
<Page Include="Themes\Generic.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>

7
samples/XamlDesigner/XamlFormatter.cs

@ -37,10 +37,9 @@ namespace ICSharpCode.XamlDesigner @@ -37,10 +37,9 @@ namespace ICSharpCode.XamlDesigner
foreach (var c in node.Nodes()) {
if (c is XElement) {
WalkElement(c as XElement);
}
else {
} else {
NewLine();
Append(c.ToString());
Append(c.ToString().Trim());
}
}
}
@ -91,7 +90,7 @@ namespace ICSharpCode.XamlDesigner @@ -91,7 +90,7 @@ namespace ICSharpCode.XamlDesigner
nextColumn -= Indenation;
NewLine();
Append("</" + e.Name.LocalName + ">");
Append("</" + name1 + ">");
}
else {
Append(" />");

46
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/ControlStyles.xaml

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:ICSharpCode.WpfDesign.Designer.Controls"
xmlns:Controls="clr-namespace:ICSharpCode.WpfDesign.Designer.Controls"
>
<!--
This file contains the default styles used by the Controls in ICSharpCode.WpfDesign.Designer.Controls
@ -10,10 +10,18 @@ @@ -10,10 +10,18 @@
<ResourceDictionary Source="NumericUpDown.xaml" />
</ResourceDictionary.MergedDictionaries>
<Style TargetType="{x:Type src:ResizeThumb}">
<Style TargetType="{x:Type Controls:EnumButton}"
BasedOn="{StaticResource {x:Type ToggleButton}}">
<Setter Property="Margin"
Value="3 3 0 3" />
<Setter Property="MinWidth"
Value="50" />
</Style>
<Style TargetType="{x:Type Controls:ResizeThumb}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type src:ResizeThumb}">
<ControlTemplate TargetType="{x:Type Controls:ResizeThumb}">
<Rectangle Name="thumbRectangle"
Width="7" Height="7" SnapsToDevicePixels="True"
Stroke="Black" Fill="White" RadiusX="1.414" RadiusY="1.414"/>
@ -34,20 +42,20 @@ @@ -34,20 +42,20 @@
</Setter>
</Style>
<Style TargetType="{x:Type src:SelectionFrame}">
<Style TargetType="{x:Type Controls:SelectionFrame}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type src:SelectionFrame}">
<ControlTemplate TargetType="{x:Type Controls:SelectionFrame}">
<Rectangle Fill="#519ABFE5" Stroke="#FF7A8787" StrokeThickness="1"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type src:ContainerDragHandle}">
<Style TargetType="{x:Type Controls:ContainerDragHandle}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type src:ContainerDragHandle}">
<ControlTemplate TargetType="{x:Type Controls:ContainerDragHandle}">
<Canvas Height="13" Width="13" Name="Canvas" SnapsToDevicePixels="True">
<Rectangle Height="13" Width="13" RadiusX="2" RadiusY="2"
Fill="#889ABFE5" Name="BorderRectangle" Stroke="#FF7A8FB5" StrokeThickness="1" />
@ -67,14 +75,14 @@ @@ -67,14 +75,14 @@
</Setter>
</Style>
<Style TargetType="{x:Type src:WindowClone}">
<Style TargetType="{x:Type Controls:WindowClone}">
<Setter Property="Width"
Value="640" />
<Setter Property="Height"
Value="480" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type src:WindowClone}">
<ControlTemplate TargetType="{x:Type Controls:WindowClone}">
<Border Background="{DynamicResource {x:Static SystemColors.GradientActiveCaptionBrushKey}}" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1,1,1,1" CornerRadius="5,5,5,5">
<DockPanel Margin="4,0,4,4">
<DockPanel Height="26" DockPanel.Dock="Top">
@ -107,14 +115,14 @@ @@ -107,14 +115,14 @@
</Setter>
</Style>
<Style TargetType="{x:Type src:ErrorBalloon}">
<Style TargetType="{x:Type Controls:ErrorBalloon}">
<Setter Property="WindowStyle" Value="None"/>
<Setter Property="AllowsTransparency" Value="True"/>
<Setter Property="SizeToContent" Value="WidthAndHeight"/>
<Setter Property="ShowInTaskbar" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type src:ErrorBalloon}">
<ControlTemplate TargetType="{x:Type Controls:ErrorBalloon}">
<Grid x:Name="LayoutRoot">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
@ -150,21 +158,21 @@ @@ -150,21 +158,21 @@
</Setter>
</Style>
<Style TargetType="{x:Type src:GridRailAdorner}">
<Style TargetType="{x:Type Controls:GridRailAdorner}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type src:GridRailAdorner}">
<ControlTemplate TargetType="{x:Type Controls:GridRailAdorner}">
<Rectangle Fill="#302020ff"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type src:GridRowSplitterAdorner}">
<Style TargetType="{x:Type Controls:GridRowSplitterAdorner}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type src:GridRowSplitterAdorner}">
<Grid Height="{x:Static src:GridRailAdorner.SplitterWidth}">
<ControlTemplate TargetType="{x:Type Controls:GridRowSplitterAdorner}">
<Grid Height="{x:Static Controls:GridRailAdorner.SplitterWidth}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10"/> <!-- 10=RailSize -->
<ColumnDefinition Width="*"/>
@ -188,11 +196,11 @@ @@ -188,11 +196,11 @@
</Setter>
</Style>
<Style TargetType="{x:Type src:GridColumnSplitterAdorner}">
<Style TargetType="{x:Type Controls:GridColumnSplitterAdorner}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type src:GridColumnSplitterAdorner}">
<Grid Width="{x:Static src:GridRailAdorner.SplitterWidth}">
<ControlTemplate TargetType="{x:Type Controls:GridColumnSplitterAdorner}">
<Grid Width="{x:Static Controls:GridRailAdorner.SplitterWidth}">
<Grid.RowDefinitions>
<RowDefinition Height="10"/> <!-- 10=RailSize -->
<RowDefinition Height="*"/>

7
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/EnumBar.xaml

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
<UserControl
x:Class="ICSharpCode.WpfDesign.Designer.Controls.EnumBar"
xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel x:Name="uxPanel"
Orientation="Horizontal" />
</UserControl>

112
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/EnumBar.xaml.cs

@ -0,0 +1,112 @@ @@ -0,0 +1,112 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Controls.Primitives;
namespace ICSharpCode.WpfDesign.Designer.Controls
{
public partial class EnumBar
{
public EnumBar()
{
InitializeComponent();
}
Type currentEnumType;
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(object), typeof(EnumBar),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public object Value {
get { return (object)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
public static readonly DependencyProperty ContainerProperty =
DependencyProperty.Register("Container", typeof(Panel), typeof(EnumBar));
public Panel Container {
get { return (Panel)GetValue(ContainerProperty); }
set { SetValue(ContainerProperty, value); }
}
public static readonly DependencyProperty ButtonStyleProperty =
DependencyProperty.Register("ButtonStyle", typeof(Style), typeof(EnumBar));
public Style ButtonStyle {
get { return (Style)GetValue(ButtonStyleProperty); }
set { SetValue(ButtonStyleProperty, value); }
}
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
if (e.Property == ValueProperty) {
var type = e.NewValue.GetType();
if (currentEnumType != type) {
currentEnumType = type;
uxPanel.Children.Clear();
foreach (var v in Enum.GetValues(type)) {
var b = new EnumButton();
b.Value = v;
b.Content = Enum.GetName(type, v);
b.SetBinding(StyleProperty, new Binding("ButtonStyle") { Source = this });
b.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(button_PreviewMouseLeftButtonDown);
uxPanel.Children.Add(b);
}
}
UpdateButtons();
UpdateContainer();
} else if (e.Property == ContainerProperty) {
UpdateContainer();
}
}
void UpdateButtons()
{
foreach (EnumButton c in uxPanel.Children) {
if (c.Value.Equals(Value)) {
c.IsChecked = true;
}
else {
c.IsChecked = false;
}
}
}
void UpdateContainer()
{
if (Container != null) {
for (int i = 0; i < uxPanel.Children.Count; i++) {
var c = uxPanel.Children[i] as EnumButton;
if (c.IsChecked.Value)
Container.Children[i].Visibility = Visibility.Visible;
else
Container.Children[i].Visibility = Visibility.Collapsed;
}
}
}
void button_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Value = (sender as EnumButton).Value;
e.Handled = true;
}
}
}

26
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Controls/EnumButton.cs

@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls.Primitives;
using System.Windows;
namespace ICSharpCode.WpfDesign.Designer.Controls
{
public class EnumButton : ToggleButton
{
static EnumButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(EnumButton),
new FrameworkPropertyMetadata(typeof(EnumButton)));
}
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(object), typeof(EnumButton));
public object Value {
get { return (object)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
}
}

24
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Converters.cs

@ -39,6 +39,21 @@ namespace ICSharpCode.WpfDesign.Designer.Converters @@ -39,6 +39,21 @@ namespace ICSharpCode.WpfDesign.Designer.Converters
}
}
public class CollapsedWhenFalse : IValueConverter
{
public static CollapsedWhenFalse Instance = new CollapsedWhenFalse();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class LevelConverter : IValueConverter
{
public static LevelConverter Instance = new LevelConverter();
@ -54,16 +69,15 @@ namespace ICSharpCode.WpfDesign.Designer.Converters @@ -54,16 +69,15 @@ namespace ICSharpCode.WpfDesign.Designer.Converters
}
}
public class CollapsedWhenEmptyCollection : IValueConverter
public class CollapsedWhenZero : IValueConverter
{
public static CollapsedWhenEmptyCollection Instance = new CollapsedWhenEmptyCollection();
public static CollapsedWhenZero Instance = new CollapsedWhenZero();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
ICollection col = value as ICollection;
if (col != null && col.Count == 0) {
if (value == null || (int)value == 0) {
return Visibility.Collapsed;
}
}
return Visibility.Visible;
}

4
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs

@ -70,7 +70,9 @@ namespace ICSharpCode.WpfDesign.Designer @@ -70,7 +70,9 @@ namespace ICSharpCode.WpfDesign.Designer
_scrollViewer.Content = _designPanel;
_scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
_scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Visible;
this.VisualChild = _scrollViewer;
this.DataContext = null;
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Undo, OnUndoExecuted, OnUndoCanExecute));
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Redo, OnRedoExecuted, OnRedoCanExecute));
@ -122,7 +124,7 @@ namespace ICSharpCode.WpfDesign.Designer @@ -122,7 +124,7 @@ namespace ICSharpCode.WpfDesign.Designer
{
List<DesignItem> result = new List<DesignItem>(items.Count);
foreach (DesignItem item in items) {
if (ModelTools.IsInDocument(item)) {
if (ModelTools.IsInDocument(item) && ModelTools.CanSelectComponent(item)) {
result.Add(item);
}
}

12
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ExtensionMethods.cs

@ -5,6 +5,7 @@ using System.Text; @@ -5,6 +5,7 @@ using System.Text;
using System.Reflection;
using System.Collections;
using System.Windows;
using System.Windows.Media;
namespace ICSharpCode.WpfDesign.Designer
{
@ -26,9 +27,18 @@ namespace ICSharpCode.WpfDesign.Designer @@ -26,9 +27,18 @@ namespace ICSharpCode.WpfDesign.Designer
{
var f = e.OriginalSource as FrameworkElement;
if (f != null) {
return f.DataContext;;
return f.DataContext;
}
return null;
}
public static T FindAncestor<T>(this DependencyObject d, string name) where T : class
{
while (true) {
if (d == null) return null;
if (d is T && d is FrameworkElement && (d as FrameworkElement).Name == name) return d as T;
d = VisualTreeHelper.GetParent(d);
}
}
}
}

5
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs

@ -68,6 +68,11 @@ namespace ICSharpCode.WpfDesign.Designer @@ -68,6 +68,11 @@ namespace ICSharpCode.WpfDesign.Designer
return b != null
&& b.CanPlace(items, PlacementType.Delete, PlacementAlignment.Center);
}
public static bool CanSelectComponent(DesignItem item)
{
return item.View != null;
}
/// <summary>
/// Deletes the specified components from their parent containers.

19
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/BasicMetadata.cs

@ -12,6 +12,7 @@ using System.Windows.Media.Imaging; @@ -12,6 +12,7 @@ using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Windows.Data;
namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
{
@ -543,6 +544,24 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid @@ -543,6 +544,24 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
Metadata.AddValueRange(Track.ViewportSizeProperty, 0, double.PositiveInfinity);
Metadata.AddValueRange(UIElement.OpacityProperty, 0, 1);
Metadata.AddAdvancedProperty(typeof(Binding), "ValidationRules");
Metadata.AddAdvancedProperty(typeof(Binding), "ValidatesOnExceptions");
Metadata.AddAdvancedProperty(typeof(Binding), "ValidatesOnDataErrors");
Metadata.AddAdvancedProperty(typeof(Binding), "NotifyOnSourceUpdated");
Metadata.AddAdvancedProperty(typeof(Binding), "NotifyOnTargetUpdated");
Metadata.AddAdvancedProperty(typeof(Binding), "NotifyOnValidationError");
Metadata.AddAdvancedProperty(typeof(Binding), "ConverterParameter");
Metadata.AddAdvancedProperty(typeof(Binding), "ConverterCulture");
Metadata.AddAdvancedProperty(typeof(Binding), "Source");
Metadata.AddAdvancedProperty(typeof(Binding), "RelativeSource");
Metadata.AddAdvancedProperty(typeof(Binding), "IsAsync");
Metadata.AddAdvancedProperty(typeof(Binding), "AsyncState");
Metadata.AddAdvancedProperty(typeof(Binding), "BindsDirectlyToSource");
Metadata.AddAdvancedProperty(typeof(Binding), "UpdateSourceExceptionFilter");
Metadata.AddAdvancedProperty(typeof(BindingBase), "FallbackValue");
Metadata.AddAdvancedProperty(typeof(BindingBase), "StringFormat");
Metadata.AddAdvancedProperty(typeof(BindingBase), "TargetNullValue");
}
}
}

4
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/Editors/BrushEditor/BrushEditor.cs

@ -171,7 +171,9 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid.Editors.BrushEditor @@ -171,7 +171,9 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid.Editors.BrushEditor
public void Commit()
{
Property.Value = Brush.Clone();
if (Brush != null) {
Property.Value = Brush.Clone();
}
}
#region INotifyPropertyChanged Members

6
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyContextMenu.xaml

@ -4,11 +4,11 @@ @@ -4,11 +4,11 @@
>
<MenuItem Header="Reset"
Click="Click_Reset" />
<MenuItem Header="TODO:"
IsEnabled="False"/>
Click="Click_Reset" />
<MenuItem Header="Binding"
Click="Click_Binding" />
<MenuItem Header="TODO:"
IsEnabled="False" />
<MenuItem x:Name="uxStaticResource"
Header="Static Resource">
<MenuItem Header="Resource1" />

202
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.xaml

@ -1,4 +1,5 @@ @@ -1,4 +1,5 @@
<UserControl x:Class="ICSharpCode.WpfDesign.Designer.PropertyGrid.PropertyGridView"
x:Name="root"
xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Converters="clr-namespace:ICSharpCode.WpfDesign.Designer.Converters"
@ -6,8 +7,7 @@ @@ -6,8 +7,7 @@
xmlns:PropertyGridBase="clr-namespace:ICSharpCode.WpfDesign.PropertyGrid;assembly=ICSharpCode.WpfDesign"
xmlns:Controls="clr-namespace:ICSharpCode.WpfDesign.Designer.Controls"
Background="{x:Static SystemColors.ControlLightBrush}"
SnapsToDevicePixels="True"
>
SnapsToDevicePixels="True">
<UserControl.Resources>
@ -61,7 +61,7 @@ @@ -61,7 +61,7 @@
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border Background="#F9F9F4"
BorderThickness="1 0 1 0"
BorderThickness="0 0 0 1"
BorderBrush="{x:Static SystemColors.ControlBrush}">
<!--<TextBlock Text="More..."
VerticalAlignment="Center"
@ -113,101 +113,6 @@ @@ -113,101 +113,6 @@
</Setter>
</Style>
<Style TargetType="{x:Type PropertyGrid:PropertyTreeView}">
<Setter Property="Background"
Value="White" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type PropertyGrid:PropertyTreeView}">
<Border BorderThickness="0 1 1 0"
BorderBrush="{x:Static SystemColors.ControlBrush}"
Background="{TemplateBinding Background}">
<!--<ScrollViewer HorizontalScrollBarVisibility="Disabled">-->
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ItemsPresenter />
<Thumb x:Name="PART_Thumb"
HorizontalAlignment="Left"
Width="4"
Margin="-2 0 0 0"
Cursor="SizeWE">
<Thumb.RenderTransform>
<TranslateTransform X="{Binding FirstColumnWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type PropertyGrid:PropertyGridView}}}" />
</Thumb.RenderTransform>
<Thumb.Template>
<ControlTemplate>
<Border Background="Transparent" />
</ControlTemplate>
</Thumb.Template>
</Thumb>
</Grid>
<!--</ScrollViewer>-->
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="{x:Type PropertyGrid:PropertyTreeViewItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type PropertyGrid:PropertyTreeViewItem}">
<DockPanel>
<Border MinHeight="20"
BorderThickness="1 0 0 1"
BorderBrush="{x:Static SystemColors.ControlBrush}"
Background="{TemplateBinding Background}"
DockPanel.Dock="Top">
<DockPanel>
<DockPanel Width="{Binding FirstColumnWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type PropertyGrid:PropertyGridView}}}"
DockPanel.Dock="Left">
<ToggleButton x:Name="expandButton"
DockPanel.Dock="Left"
Margin="{TemplateBinding Level, Converter={x:Static Converters:LevelConverter.Instance}}"
Style="{StaticResource ExpandButtonStyle}"
IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" />
<TextBlock Text="{Binding Name}"
TextTrimming="CharacterEllipsis"
VerticalAlignment="Center"
Margin="7 0 0 0"
ToolTip="{Binding Description}"
FontWeight="{Binding FontWeight}"
/>
</DockPanel>
<Border BorderThickness="1 0 0 0"
BorderBrush="{x:Static SystemColors.ControlBrush}">
<ContentPresenter Content="{Binding Editor}"
VerticalAlignment="Center"
Margin="3 0" />
</Border>
</DockPanel>
</Border>
<ItemsPresenter x:Name="itemsHost" />
</DockPanel>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded"
Value="False">
<Setter TargetName="itemsHost"
Property="Visibility"
Value="Collapsed" />
</Trigger>
<Trigger Property="HasItems"
Value="False">
<Setter TargetName="expandButton"
Property="Visibility"
Value="Hidden" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="CategoryExpanderStyle"
TargetType="Expander">
<Setter Property="Template">
@ -265,20 +170,60 @@ @@ -265,20 +170,60 @@
Style="{StaticResource CategoryExpanderStyle}"
IsExpanded="{Binding IsExpanded}">
<StackPanel>
<PropertyGrid:PropertyTreeView ItemsSource="{Binding Properties}" />
<Expander Visibility="{Binding MoreProperties, Converter={x:Static Converters:CollapsedWhenEmptyCollection.Instance}}"
<ItemsControl ItemsSource="{Binding Properties}" />
<Expander Visibility="{Binding MoreProperties.Count, Converter={x:Static Converters:CollapsedWhenZero.Instance}}"
Style="{StaticResource MoreExpanderStyle}"
IsExpanded="{Binding ShowMore}">
<PropertyGrid:PropertyTreeView ItemsSource="{Binding MoreProperties}"
Background="#F9F9F4" />
<ItemsControl ItemsSource="{Binding MoreProperties}"
Background="#F9F9F4" />
</Expander>
</StackPanel>
</Expander>
</DataTemplate>
<HierarchicalDataTemplate DataType="{x:Type PropertyGridBase:PropertyNode}"
ItemsSource="{Binding Children}" />
<DataTemplate DataType="{x:Type PropertyGridBase:PropertyNode}">
<StackPanel>
<Border x:Name="uxPropertyNodeRow"
MinHeight="20"
BorderThickness="0 0 0 1"
BorderBrush="{x:Static SystemColors.ControlBrush}"
DockPanel.Dock="Top">
<DockPanel>
<DockPanel Width="{Binding FirstColumnWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type PropertyGrid:PropertyGridView}}}"
DockPanel.Dock="Left">
<ToggleButton x:Name="expandButton"
DockPanel.Dock="Left"
Margin="{Binding Level, Converter={x:Static Converters:LevelConverter.Instance}}"
Style="{StaticResource ExpandButtonStyle}"
IsChecked="{Binding IsExpanded}"
Visibility="{Binding HasChildren, Converter={x:Static Converters:HiddenWhenFalse.Instance}}" />
<TextBlock Text="{Binding Name}"
TextTrimming="CharacterEllipsis"
VerticalAlignment="Center"
Margin="7 0 0 0"
ToolTip="{Binding Description}"
FontWeight="{Binding FontWeight}" />
</DockPanel>
<Border BorderThickness="1 0 0 0"
BorderBrush="{x:Static SystemColors.ControlBrush}">
<ContentPresenter Content="{Binding Editor}"
VerticalAlignment="Center"
Margin="3 0" />
</Border>
</DockPanel>
</Border>
<StackPanel Visibility="{Binding IsExpanded, Converter={x:Static Converters:CollapsedWhenFalse.Instance}}">
<ItemsControl ItemsSource="{Binding Children}"
Visibility="{Binding Children.Count, Converter={x:Static Converters:CollapsedWhenZero.Instance}}" />
<Expander Visibility="{Binding MoreChildren.Count, Converter={x:Static Converters:CollapsedWhenZero.Instance}}"
Style="{StaticResource MoreExpanderStyle}">
<ItemsControl ItemsSource="{Binding MoreChildren}"
Background="#F9F9F4" />
</Expander>
</StackPanel>
</StackPanel>
</DataTemplate>
<!--<DataTemplate DataType="{x:Type FontFamily}">
<TextBlock Text="{Binding}"
FontFamily="{Binding}"
@ -329,16 +274,43 @@ @@ -329,16 +274,43 @@
Height="21.277"
Width="40" />
</Grid>
<TabControl SelectedIndex="{Binding CurrentTab, Converter={x:Static Converters:IntFromEnumConverter.Instance}}">
<TabItem Header="Properties">
<ScrollViewer HorizontalScrollBarVisibility="Disabled">
<ItemsControl ItemsSource="{Binding Categories}" />
</ScrollViewer>
</TabItem>
<TabItem Header="Events">
<PropertyGrid:PropertyTreeView ItemsSource="{Binding Events}" />
</TabItem>
</TabControl>
<Controls:EnumBar Value="{Binding CurrentTab}"
Container="{Binding ElementName=c1}"
Margin="5 0 0 5"
DockPanel.Dock="Top">
<Controls:EnumBar.ButtonStyle>
<Style TargetType="ToggleButton">
<Setter Property="Width"
Value="70" />
</Style>
</Controls:EnumBar.ButtonStyle>
</Controls:EnumBar>
<Grid x:Name="c1"
Background="White">
<ScrollViewer HorizontalScrollBarVisibility="Disabled">
<ItemsControl ItemsSource="{Binding Categories}" />
</ScrollViewer>
<ScrollViewer HorizontalScrollBarVisibility="Disabled">
<ItemsControl ItemsSource="{Binding Events}" />
</ScrollViewer>
<Thumb x:Name="thumb"
HorizontalAlignment="Left"
Width="4"
Margin="-2 0 0 0"
Cursor="SizeWE">
<Thumb.RenderTransform>
<TranslateTransform X="{Binding FirstColumnWidth, ElementName=root}" />
</Thumb.RenderTransform>
<Thumb.Template>
<ControlTemplate>
<Border Background="Transparent" />
</ControlTemplate>
</Thumb.Template>
</Thumb>
</Grid>
</DockPanel>
</UserControl>

26
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyGridView.xaml.cs

@ -12,6 +12,7 @@ using System.Windows.Media.Imaging; @@ -12,6 +12,7 @@ using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Controls.Primitives;
using ICSharpCode.WpfDesign.PropertyGrid;
namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
{
@ -24,7 +25,7 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid @@ -24,7 +25,7 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
InitializeComponent();
AddHandler(Thumb.DragDeltaEvent, new DragDeltaEventHandler(dragDeltaHandler));
thumb.DragDelta += new DragDeltaEventHandler(thumb_DragDelta);
}
static PropertyContextMenu propertyContextMenu = new PropertyContextMenu();
@ -56,17 +57,30 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid @@ -56,17 +57,30 @@ namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
}
}
protected override void OnMouseRightButtonDown(MouseButtonEventArgs e)
{
var row = (e.OriginalSource as DependencyObject).FindAncestor<Border>("uxPropertyNodeRow");
if (row == null) return;
var node = row.DataContext as PropertyNode;
if (node.IsEvent) return;
var contextMenu = new PropertyContextMenu();
contextMenu.DataContext = node;
contextMenu.Placement = PlacementMode.Bottom;
contextMenu.HorizontalOffset = -30;
contextMenu.PlacementTarget = row;
contextMenu.IsOpen = true;
}
void clearButton_Click(object sender, RoutedEventArgs e)
{
PropertyGrid.ClearFilter();
}
void dragDeltaHandler(object sender, DragDeltaEventArgs e)
void thumb_DragDelta(object sender, DragDeltaEventArgs e)
{
Thumb thumb = e.OriginalSource as Thumb;
if (thumb != null && thumb.Name == "PART_Thumb") {
FirstColumnWidth = Math.Max(0, FirstColumnWidth + e.HorizontalChange);
}
FirstColumnWidth = Math.Max(0, FirstColumnWidth + e.HorizontalChange);
}
}
}

101
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/PropertyGrid/PropertyTreeView.cs

@ -1,101 +0,0 @@ @@ -1,101 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows;
using System.Windows.Input;
using System.Windows.Controls.Primitives;
namespace ICSharpCode.WpfDesign.Designer.PropertyGrid
{
public class PropertyTreeView : TreeView
{
//static Dictionary<object, PropertyTreeViewItem> containersCache = new Dictionary<object, PropertyTreeViewItem>();
protected override DependencyObject GetContainerForItemOverride()
{
//return new Decorator();
return new PropertyTreeViewItem();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is PropertyTreeViewItem;
}
//protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
//{
// PrepareContainer(element, item);
//}
//internal void PrepareContainer(DependencyObject element, object item)
//{
// PropertyTreeViewItem container;
// if (!containersCache.TryGetValue(item, out container))
// {
// container = new PropertyTreeViewItem();
// containersCache[item] = container;
// }
// base.PrepareContainerForItemOverride(container, item);
// (element as Decorator).Child = container;
//}
}
public class PropertyTreeViewItem : TreeViewItem
{
//public PropertyTreeView ParentTree { get; private set; }
public static readonly DependencyProperty LevelProperty =
DependencyProperty.Register("Level", typeof(int), typeof(PropertyTreeViewItem));
public int Level {
get { return (int)GetValue(LevelProperty); }
set { SetValue(LevelProperty, value); }
}
protected override DependencyObject GetContainerForItemOverride()
{
//return new Decorator();
return new PropertyTreeViewItem();
}
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is PropertyTreeViewItem;
}
//protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
//{
// ParentTree.PrepareContainer(element, item);
//}
protected override void OnVisualParentChanged(DependencyObject oldParent)
{
base.OnVisualParentChanged(oldParent);
var parent = ItemsControl.ItemsControlFromItemContainer(this);
//ParentTree = parent as PropertyTreeView;
var parentItem = parent as PropertyTreeViewItem;
if (parentItem != null) {
Level = parentItem.Level + 1;
//ParentTree = parentItem.ParentTree;
}
}
protected override void OnMouseDown(MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Right) {
e.Handled = true;
var contextMenu = new PropertyContextMenu();
contextMenu.DataContext = DataContext;
contextMenu.Placement = PlacementMode.Bottom;
contextMenu.HorizontalOffset = -30;
contextMenu.PlacementTarget = this;
contextMenu.IsOpen = true;
}
}
}
}

15
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/WpfDesign.Designer.csproj

@ -40,10 +40,12 @@ @@ -40,10 +40,12 @@
<Reference Include="PresentationCore">
<Private>False</Private>
<SpecificVersion>False</SpecificVersion>
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="PresentationFramework">
<Private>False</Private>
<SpecificVersion>False</SpecificVersion>
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core">
@ -51,8 +53,12 @@ @@ -51,8 +53,12 @@
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="UIAutomationProvider">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase">
<Private>False</Private>
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
</ItemGroup>
<ItemGroup>
@ -64,6 +70,10 @@ @@ -64,6 +70,10 @@
<Compile Include="Controls\ContainerDragHandle.cs" />
<Compile Include="Controls\DropDownButton.cs" />
<Compile Include="Controls\EnterTextBox.cs" />
<Compile Include="Controls\EnumBar.xaml.cs">
<DependentUpon>EnumBar.xaml</DependentUpon>
</Compile>
<Compile Include="Controls\EnumButton.cs" />
<Compile Include="Controls\GridAdorner.cs" />
<Compile Include="Controls\NumericUpDown.cs" />
<Compile Include="Controls\SelectionFrame.cs" />
@ -133,7 +143,6 @@ @@ -133,7 +143,6 @@
<Compile Include="PropertyGrid\PropertyGridView.xaml.cs">
<DependentUpon>PropertyGridView.xaml</DependentUpon>
</Compile>
<Compile Include="PropertyGrid\PropertyTreeView.cs" />
<Compile Include="ServiceRequiredException.cs" />
<Compile Include="Services\ChooseClass.cs" />
<Compile Include="Services\ChooseClassDialog.xaml.cs">
@ -174,6 +183,10 @@ @@ -174,6 +183,10 @@
<SpecificVersion>False</SpecificVersion>
<Private>True</Private>
</ProjectReference>
<Page Include="Controls\EnumBar.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Controls\NumericUpDown.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>

37
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Xaml/XamlModelProperty.cs

@ -13,6 +13,7 @@ using System.Diagnostics; @@ -13,6 +13,7 @@ using System.Diagnostics;
using ICSharpCode.WpfDesign.XamlDom;
using ICSharpCode.WpfDesign.Designer.Services;
using System.Windows;
using System.Windows.Markup;
namespace ICSharpCode.WpfDesign.Designer.Xaml
{
@ -188,16 +189,14 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml @@ -188,16 +189,14 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml
UndoService undoService = _designItem.Services.GetService<UndoService>();
if (undoService != null)
undoService.Execute(new PropertyChangeAction(this, true, newValue, value));
undoService.Execute(new PropertyChangeAction(this, newValue, true));
else
SetValueInternal(value, newValue);
SetValueInternal(newValue);
}
void SetValueInternal(object value, XamlPropertyValue newValue)
{
_property.ValueOnInstance = value;
_property.PropertyValue = newValue;
void SetValueInternal(XamlPropertyValue newValue)
{
_property.PropertyValue = newValue;
_designItem.NotifyPropertyChanged(this);
}
@ -205,7 +204,7 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml @@ -205,7 +204,7 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml
{
UndoService undoService = _designItem.Services.GetService<UndoService>();
if (undoService != null)
undoService.Execute(new PropertyChangeAction(this, false, null, null));
undoService.Execute(new PropertyChangeAction(this, null, false));
else
ResetInternal();
}
@ -220,27 +219,20 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml @@ -220,27 +219,20 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml
public sealed class PropertyChangeAction : ITransactionItem
{
XamlModelProperty property;
bool newIsSet;
XamlPropertyValue newValue;
object newObject;
XamlModelProperty property;
XamlPropertyValue oldValue;
object oldObject;
XamlPropertyValue newValue;
bool oldIsSet;
bool newIsSet;
public PropertyChangeAction(XamlModelProperty property, bool newIsSet, XamlPropertyValue newValue, object newObject)
public PropertyChangeAction(XamlModelProperty property, XamlPropertyValue newValue, bool newIsSet)
{
this.property = property;
this.newIsSet = newIsSet;
this.newValue = newValue;
this.newObject = newObject;
this.newIsSet = newIsSet;
oldIsSet = property._property.IsSet;
oldValue = property._property.PropertyValue;
oldObject = property._property.ValueOnInstance;
}
public string Title {
@ -255,7 +247,7 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml @@ -255,7 +247,7 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml
public void Do()
{
if (newIsSet)
property.SetValueInternal(newObject, newValue);
property.SetValueInternal(newValue);
else
property.ResetInternal();
}
@ -263,7 +255,7 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml @@ -263,7 +255,7 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml
public void Undo()
{
if (oldIsSet)
property.SetValueInternal(oldObject, oldValue);
property.SetValueInternal(oldValue);
else
property.ResetInternal();
}
@ -279,7 +271,6 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml @@ -279,7 +271,6 @@ namespace ICSharpCode.WpfDesign.Designer.Xaml
if (property._property == other.property._property) {
newIsSet = other.newIsSet;
newValue = other.newValue;
newObject = other.newObject;
return true;
}
return false;

9
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/XamlDom/MarkupExtensionTests.cs

@ -8,21 +8,18 @@ namespace ICSharpCode.WpfDesign.Tests.XamlDom @@ -8,21 +8,18 @@ namespace ICSharpCode.WpfDesign.Tests.XamlDom
public class MarkupExtensionTests : TestHelper
{
[Test]
[Ignore]
public void Test1()
{
TestMarkupExtension("Title=\"{Binding}\"");
}
[Test]
[Ignore]
public void Test2()
{
TestMarkupExtension("Title=\"{Binding Some}\"");
}
[Test]
[Ignore]
public void Test3()
{
TestMarkupExtension("Title=\"{ Binding Some , ElementName = Some , Mode = TwoWay }\"");
@ -54,15 +51,15 @@ namespace ICSharpCode.WpfDesign.Tests.XamlDom @@ -54,15 +51,15 @@ namespace ICSharpCode.WpfDesign.Tests.XamlDom
}
[Test]
[Ignore]
public void Test8()
{
TestMarkupExtension("Content=\"{Binding Some, RelativeSource={RelativeSource Self}}\"");
}
[Test]
[Ignore]
[ExpectedException] // Must differ from official XamlReader result
//[ExpectedException]
// Must differ from official XamlReader result, because Static dereference
// To catch this we should use XamlDocument.Save() instead of XamlWriter.Save(instance)
public void Test9()
{
TestMarkupExtension("Content=\"{x:Static t:MyStaticClass.StaticString}\"");

164
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionParser.cs

@ -15,11 +15,13 @@ using System.Runtime.Serialization; @@ -15,11 +15,13 @@ using System.Runtime.Serialization;
using System.Text;
using System.Windows.Markup;
using System.Xml;
using System.Reflection;
namespace ICSharpCode.WpfDesign.XamlDom
{
/// <summary>
/// Tokenizer for markup extension attributes.
/// [MS-XAML 6.6.7.1]
/// </summary>
sealed class MarkupExtensionTokenizer
{
@ -69,10 +71,6 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -69,10 +71,6 @@ namespace ICSharpCode.WpfDesign.XamlDom
AddToken(MarkupExtensionTokenKind.Comma, ",");
pos++;
break;
case '{':
AddToken(MarkupExtensionTokenKind.OpenBrace, "{");
pos++;
break;
default:
MembernameOrString();
break;
@ -97,7 +95,7 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -97,7 +95,7 @@ namespace ICSharpCode.WpfDesign.XamlDom
ConsumeWhitespace();
} else {
int braceTotal = 0;
while (braceTotal >= 0) {
while (true) {
CheckNotEOF();
switch (text[pos]) {
case '\\':
@ -110,20 +108,21 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -110,20 +108,21 @@ namespace ICSharpCode.WpfDesign.XamlDom
braceTotal++;
break;
case '}':
if (braceTotal != 0) {
b.Append(text[pos++]);
}
if (braceTotal == 0) goto stop;
b.Append(text[pos++]);
braceTotal--;
break;
case ',':
case '=':
braceTotal = -1;
if (braceTotal == 0) goto stop;
b.Append(text[pos++]);
break;
default:
b.Append(text[pos++]);
break;
}
}
stop:;
}
CheckNotEOF();
string valueText = b.ToString();
@ -219,109 +218,106 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -219,109 +218,106 @@ namespace ICSharpCode.WpfDesign.XamlDom
}
}
/// <summary>
/// [MS-XAML 6.6.7.2]
/// </summary>
static class MarkupExtensionParser
{
public static MarkupExtension ConstructMarkupExtension(string attributeText, XamlObject containingObject, XamlTypeResolverProvider typeResolver)
public static XamlObject Parse(string text, XamlObject parent, XmlAttribute attribute)
{
if (containingObject == null)
throw new ArgumentNullException("containingObject");
Debug.WriteLine("ConstructMarkupExtension " + attributeText);
List<MarkupExtensionToken> markupExtensionTokens = MarkupExtensionTokenizer.Tokenize(attributeText);
if (markupExtensionTokens.Count < 3
|| markupExtensionTokens[0].Kind != MarkupExtensionTokenKind.OpenBrace
|| markupExtensionTokens[1].Kind != MarkupExtensionTokenKind.TypeName
|| markupExtensionTokens[markupExtensionTokens.Count-1].Kind != MarkupExtensionTokenKind.CloseBrace)
var tokens = MarkupExtensionTokenizer.Tokenize(text);
if (tokens.Count < 3
|| tokens[0].Kind != MarkupExtensionTokenKind.OpenBrace
|| tokens[1].Kind != MarkupExtensionTokenKind.TypeName
|| tokens[tokens.Count-1].Kind != MarkupExtensionTokenKind.CloseBrace)
{
throw new XamlMarkupExtensionParseException("Invalid markup extension");
}
string typeName = markupExtensionTokens[1].Value;
var typeResolver = parent.ServiceProvider.Resolver;
string typeName = tokens[1].Value;
Type extensionType = typeResolver.Resolve(typeName + "Extension");
if (extensionType == null) extensionType = typeResolver.Resolve(typeName);
if (extensionType == null || !typeof(MarkupExtension).IsAssignableFrom(extensionType)) {
throw new XamlMarkupExtensionParseException("Unknown markup extension " + typeName + "Extension");
}
if (extensionType == typeof(TypeExtension))
extensionType = typeof(MyTypeExtension);
if (extensionType == typeof(System.Windows.StaticResourceExtension))
extensionType = typeof(MyStaticResourceExtension);
List<string> positionalArgs = new List<string>();
List<KeyValuePair<string, string>> namedArgs = new List<KeyValuePair<string, string>>();
for (int i = 2; i < markupExtensionTokens.Count - 1; i++) {
if (markupExtensionTokens[i].Kind == MarkupExtensionTokenKind.String) {
positionalArgs.Add(markupExtensionTokens[i].Value);
} else if (markupExtensionTokens[i].Kind == MarkupExtensionTokenKind.Membername) {
if (markupExtensionTokens[i+1].Kind != MarkupExtensionTokenKind.Equals
|| markupExtensionTokens[i+2].Kind != MarkupExtensionTokenKind.String)
for (int i = 2; i < tokens.Count - 1; i++) {
if (tokens[i].Kind == MarkupExtensionTokenKind.String) {
positionalArgs.Add(tokens[i].Value);
} else if (tokens[i].Kind == MarkupExtensionTokenKind.Membername) {
if (tokens[i+1].Kind != MarkupExtensionTokenKind.Equals
|| tokens[i+2].Kind != MarkupExtensionTokenKind.String)
{
throw new XamlMarkupExtensionParseException("Invalid markup extension");
}
namedArgs.Add(new KeyValuePair<string, string>(markupExtensionTokens[i].Value,
markupExtensionTokens[i+2].Value));
namedArgs.Add(new KeyValuePair<string, string>(tokens[i].Value, tokens[i+2].Value));
i += 2;
}
}
// Find the constructor with positionalArgs.Count arguments
var ctors = extensionType.GetConstructors().Where(c => c.GetParameters().Length == positionalArgs.Count).ToList();
if (ctors.Count < 1)
throw new XamlMarkupExtensionParseException("No constructor for " + extensionType.FullName + " found that takes " + positionalArgs.Count + " arguments");
if (ctors.Count > 1)
throw new XamlMarkupExtensionParseException("Multiple constructors for " + extensionType.FullName + " found that take " + positionalArgs.Count + " arguments");
var ctorParameters = ctors[0].GetParameters();
object[] ctorArguments = new object[positionalArgs.Count];
for (int i = 0; i < ctorArguments.Length; i++) {
Type parameterType = ctorParameters[i].ParameterType;
TypeConverter c = XamlNormalPropertyInfo.GetCustomTypeConverter(parameterType)
?? TypeDescriptor.GetConverter(parameterType);
ctorArguments[i] = XamlTextValue.AttributeTextToObject(positionalArgs[i],
containingObject,
c);
throw new XamlMarkupExtensionParseException("No constructor for " +
extensionType.FullName + " found that takes " + positionalArgs.Count + " arguments");
if (ctors.Count > 1) {
Debug.WriteLine("Multiple constructors for " +
extensionType.FullName + " found that take " + positionalArgs.Count + " arguments");
}
MarkupExtension result = (MarkupExtension)ctors[0].Invoke(ctorArguments);
foreach (var pair in namedArgs) {
string memberName = pair.Key;
if (memberName.Contains(".")) {
throw new NotImplementedException();
} else {
if (memberName.Contains(":"))
memberName = memberName.Substring(memberName.IndexOf(':') + 1);
var property = extensionType.GetProperty(memberName);
if (property == null)
throw new XamlMarkupExtensionParseException("Property not found: " + extensionType.FullName + "." + memberName);
TypeConverter c = TypeDescriptor.GetConverter(property.PropertyType);
object propValue = XamlTextValue.AttributeTextToObject(pair.Value,
containingObject,
c);
property.SetValue(result, propValue, null);
var ctor = ctors[0];
var defaultCtor = extensionType.GetConstructor(Type.EmptyTypes);
bool mappingToProperties = defaultCtor != null;
List<PropertyInfo> map = new List<PropertyInfo>();
if (mappingToProperties) {
foreach (var param in ctor.GetParameters()) {
var prop = extensionType.GetProperty(param.Name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
if (prop == null) {
mappingToProperties = false;
break;
}
map.Add(prop);
}
}
return result;
}
sealed class MyTypeExtension : TypeExtension
{
public MyTypeExtension() {}
public MyTypeExtension(string typeName) : base(typeName) {}
}
sealed class MyStaticResourceExtension : System.Windows.StaticResourceExtension
{
public MyStaticResourceExtension() {}
public MyStaticResourceExtension(object resourceKey) : base(resourceKey) {}
public override object ProvideValue(IServiceProvider serviceProvider)
{
XamlTypeResolverProvider xamlTypeResolver = (XamlTypeResolverProvider)serviceProvider.GetService(typeof(XamlTypeResolverProvider));
if (xamlTypeResolver == null)
throw new XamlLoadException("XamlTypeResolverProvider not found.");
return xamlTypeResolver.FindResource(this.ResourceKey);
object instance;
if (mappingToProperties) {
instance = defaultCtor.Invoke(null);
} else {
var ctorParamsInfo = ctor.GetParameters();
var ctorParams = new object[ctorParamsInfo.Length];
for (int i = 0; i < ctorParams.Length; i++) {
var paramType = ctorParamsInfo[i].ParameterType;
ctorParams[i] = XamlParser.CreateObjectFromAttributeText(positionalArgs[i], paramType, parent);
}
instance = ctor.Invoke(ctorParams);
//TODO
//XamlObject.ConstructorArgsProperty - args collection
//Reinvoke ctor when needed
}
XamlObject result = parent.OwnerDocument.CreateObject(instance);
if (attribute != null) result.XmlAttribute = attribute;
result.ParentObject = parent;
if (mappingToProperties) {
for (int i = 0; i < positionalArgs.Count; i++) {
var a = parent.OwnerDocument.XmlDocument.CreateAttribute(map[i].Name);
a.Value = positionalArgs[i];
XamlParser.ParseObjectAttribute(result, a, false);
}
}
foreach (var pair in namedArgs) {
var a = parent.OwnerDocument.XmlDocument.CreateAttribute(pair.Key);
a.Value = pair.Value;
XamlParser.ParseObjectAttribute(result, a, false);
}
return result;
}
}
}

45
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/MarkupExtensionPrinter.cs

@ -0,0 +1,45 @@ @@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ICSharpCode.WpfDesign.XamlDom
{
public static class MarkupExtensionPrinter
{
public static bool CanPrint(XamlObject obj)
{
return true;
}
public static string Print(XamlObject obj)
{
StringBuilder sb = new StringBuilder();
sb.Append("{");
sb.Append(obj.GetNameForMarkupExtension());
bool first = true;
foreach (var property in obj.Properties) {
if (!property.IsSet) continue;
if (first)
sb.Append(" ");
else
sb.Append(", ");
first = false;
sb.Append(property.GetNameForMarkupExtension());
sb.Append("=");
var value = property.PropertyValue;
if (value is XamlTextValue) {
sb.Append((value as XamlTextValue).Text);
} else if (value is XamlObject) {
sb.Append(Print(value as XamlObject));
}
}
sb.Append("}");
return sb.ToString();
}
}
}

4
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/WpfDesign.XamlDom.csproj

@ -52,6 +52,7 @@ @@ -52,6 +52,7 @@
<Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase">
<Private>False</Private>
@ -65,11 +66,12 @@ @@ -65,11 +66,12 @@
<Compile Include="CollectionElementsCollection.cs" />
<Compile Include="CollectionSupport.cs" />
<Compile Include="MarkupExtensionParser.cs" />
<Compile Include="MarkupExtensionPrinter.cs" />
<Compile Include="XamlConstants.cs" />
<Compile Include="XamlDocument.cs" />
<Compile Include="XamlLoadException.cs" />
<Compile Include="XamlMarkupValue.cs" />
<Compile Include="XamlObject.cs" />
<Compile Include="XamlObjectServiceProvider.cs" />
<Compile Include="XamlParser.cs" />
<Compile Include="XamlParserSettings.cs" />
<Compile Include="XamlProperty.cs" />

4
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlDocument.cs

@ -60,7 +60,7 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -60,7 +60,7 @@ namespace ICSharpCode.WpfDesign.XamlDom
if (containingObject != null) {
if (containingObject.OwnerDocument != document)
throw new ArgumentException("Containing object must belong to the document!");
baseServiceProvider = new XamlTypeResolverProvider(containingObject);
baseServiceProvider = containingObject.ServiceProvider;
} else {
baseServiceProvider = document.ServiceProvider;
}
@ -148,7 +148,7 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -148,7 +148,7 @@ namespace ICSharpCode.WpfDesign.XamlDom
/// </summary>
public XamlPropertyValue CreateNullValue()
{
return new XamlMarkupValue((XamlObject)CreatePropertyValue(new System.Windows.Markup.NullExtension(), null));
return CreateObject(new NullExtension());
}
/// <summary>

52
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlMarkupValue.cs

@ -1,52 +0,0 @@ @@ -1,52 +0,0 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
using System;
using System.ComponentModel;
using System.Windows.Markup;
namespace ICSharpCode.WpfDesign.XamlDom
{
/// <summary>
/// Represents a markup extension.
/// </summary>
public class XamlMarkupValue : XamlPropertyValue
{
XamlObject markupObject;
internal XamlMarkupValue(XamlObject markupObject)
{
this.markupObject = markupObject;
}
internal override object GetValueFor(XamlPropertyInfo targetProperty)
{
return ((MarkupExtension)markupObject.Instance).ProvideValue(markupObject.OwnerDocument.ServiceProvider);
}
internal override void OnParentPropertyChanged()
{
base.OnParentPropertyChanged();
markupObject.ParentProperty = this.ParentProperty;
}
internal override void RemoveNodeFromParent()
{
markupObject.RemoveNodeFromParent();
}
internal override void AddNodeTo(XamlProperty property)
{
markupObject.AddNodeTo(property);
}
internal override System.Xml.XmlNode GetNodeForCollection()
{
return markupObject.GetNodeForCollection();
}
}
}

170
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObject.cs

@ -11,12 +11,15 @@ using System.ComponentModel; @@ -11,12 +11,15 @@ using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Markup;
using System.Xml;
using System.Windows.Data;
using System.Windows;
namespace ICSharpCode.WpfDesign.XamlDom
{
/// <summary>
/// Represents a xaml object element.
/// </summary>
[DebuggerDisplay("XamlObject: {Instance}")]
public sealed class XamlObject : XamlPropertyValue
{
XamlDocument document;
@ -37,6 +40,9 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -37,6 +40,9 @@ namespace ICSharpCode.WpfDesign.XamlDom
if (contentAttrs != null && contentAttrs.Length > 0) {
this.contentPropertyName = contentAttrs[0].Name;
}
ServiceProvider = new XamlObjectServiceProvider(this);
CreateWrapper();
}
/// <summary>For use by XamlParser only.</summary>
@ -56,8 +62,12 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -56,8 +62,12 @@ namespace ICSharpCode.WpfDesign.XamlDom
#region XamlPropertyValue implementation
internal override object GetValueFor(XamlPropertyInfo targetProperty)
{
if (instance is MarkupExtension) {
return ((MarkupExtension)instance).ProvideValue(new XamlTypeResolverProvider(this));
if (IsMarkupExtension) {
var value = ProvideValue();
if (value is string && targetProperty != null && targetProperty.ReturnType != typeof(string)) {
return XamlParser.CreateObjectFromAttributeText((string)value, targetProperty, this);
}
return value;
} else {
return instance;
}
@ -90,10 +100,87 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -90,10 +100,87 @@ namespace ICSharpCode.WpfDesign.XamlDom
internal XmlElement XmlElement {
get { return element; }
}
// exists only for ME root
XmlAttribute xmlAttribute;
internal XmlAttribute XmlAttribute {
get { return xmlAttribute; }
set {
xmlAttribute = value;
element = VirualAttachTo(XmlElement, value.OwnerElement);
}
}
public bool IsMarkupExtensionRoot {
get { return XmlAttribute != null; }
}
static XmlElement VirualAttachTo(XmlElement e, XmlElement target)
{
var prefix = target.GetPrefixOfNamespace(e.NamespaceURI);
XmlElement newElement = e.OwnerDocument.CreateElement(prefix, e.Name, e.NamespaceURI);
foreach (XmlAttribute a in target.Attributes) {
if (a.Name.StartsWith("xmlns")) {
newElement.Attributes.Append(a.Clone() as XmlAttribute);
}
}
while (e.HasChildNodes) {
newElement.AppendChild(e.FirstChild);
}
XmlAttributeCollection ac = e.Attributes;
while (ac.Count > 0) {
newElement.Attributes.Append(ac[0]);
}
return newElement;
}
internal override void AddNodeTo(XamlProperty property)
{
property.AddChildNodeToProperty(element);
if (!UpdateMarkupExtension(true)) {
property.AddChildNodeToProperty(element);
}
}
internal override void RemoveNodeFromParent()
{
if (XmlAttribute != null) {
XmlAttribute.OwnerElement.RemoveAttribute(XmlAttribute.Name);
xmlAttribute = null;
} else {
element.ParentNode.RemoveChild(element);
}
}
internal void OnPropertyChanged(XamlProperty property)
{
UpdateMarkupExtension(false);
}
bool UpdateMarkupExtension(bool canCreate)
{
if (IsMarkupExtension) {
var obj = this;
while (obj != null && obj.IsMarkupExtension) {
obj.ParentProperty.UpdateValueOnInstance();
if (obj.IsMarkupExtensionRoot) break;
obj = obj.ParentObject;
}
if (!obj.IsMarkupExtension) obj = null;
if (obj == null && !canCreate) return false;
var root = obj ?? this;
if (MarkupExtensionPrinter.CanPrint(root)) {
var s = MarkupExtensionPrinter.Print(root);
root.XmlAttribute = root.ParentProperty.SetAttribute(s);
return root == this;
}
}
return false;
}
/// <summary>
@ -109,6 +196,14 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -109,6 +196,14 @@ namespace ICSharpCode.WpfDesign.XamlDom
public object Instance {
get { return instance; }
}
public bool IsMarkupExtension {
get { return instance is MarkupExtension; }
}
public DependencyObject DependencyObject {
get { return instance as DependencyObject; }
}
/// <summary>
/// Gets the type of this object element.
@ -135,11 +230,6 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -135,11 +230,6 @@ namespace ICSharpCode.WpfDesign.XamlDom
}
}
internal override void RemoveNodeFromParent()
{
element.ParentNode.RemoveChild(element);
}
/// <summary>
/// Finds the specified property, or creates it if it doesn't exist.
/// </summary>
@ -211,5 +301,69 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -211,5 +301,69 @@ namespace ICSharpCode.WpfDesign.XamlDom
else
element.SetAttribute(name, XamlConstants.XamlNamespace, value);
}
public XamlObjectServiceProvider ServiceProvider { get; set; }
MarkupExtensionWrapper wrapper;
void CreateWrapper()
{
if (Instance is Binding) {
wrapper = new BindingWrapper();
} else if (Instance is StaticResourceExtension) {
wrapper = new StaticResourceWrapper();
}
if (wrapper != null) {
wrapper.XamlObject = this;
}
}
object ProvideValue()
{
if (wrapper != null) {
return wrapper.ProvideValue();
}
return (Instance as MarkupExtension).ProvideValue(ServiceProvider);
}
internal string GetNameForMarkupExtension()
{
return XmlElement.Name;
}
}
abstract class MarkupExtensionWrapper
{
public XamlObject XamlObject { get; set; }
public abstract object ProvideValue();
}
class BindingWrapper : MarkupExtensionWrapper
{
public override object ProvideValue()
{
var target = XamlObject.Instance as Binding;
//TODO: XamlObject.Clone()
var b = new Binding();
foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(target)) {
if (pd.IsReadOnly) continue;
try {
var val1 = pd.GetValue(b);
var val2 = pd.GetValue(target);
if (object.Equals(val1, val2)) continue;
pd.SetValue(b, val2);
} catch {}
}
return b.ProvideValue(XamlObject.ServiceProvider);
}
}
class StaticResourceWrapper : MarkupExtensionWrapper
{
public override object ProvideValue()
{
var target = XamlObject.Instance as StaticResourceExtension;
return XamlObject.ServiceProvider.Resolver.FindResource(target.ResourceKey);
}
}
}

47
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObjectServiceProvider.cs

@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Markup;
namespace ICSharpCode.WpfDesign.XamlDom
{
public class XamlObjectServiceProvider : IServiceProvider, IProvideValueTarget
{
public XamlObjectServiceProvider(XamlObject obj)
{
XamlObject = obj;
Resolver = new XamlTypeResolverProvider(obj);
}
public XamlObject XamlObject { get; private set; }
internal XamlTypeResolverProvider Resolver { get; private set; }
#region IServiceProvider Members
public object GetService(Type serviceType)
{
if (serviceType == typeof(IProvideValueTarget)) {
return this;
}
if (serviceType == typeof(IXamlTypeResolver)) {
return Resolver;
}
return null;
}
#endregion
#region IProvideValueTarget Members
public object TargetObject {
get { return XamlObject.ParentProperty.ParentObject.Instance; }
}
public object TargetProperty {
get { return XamlObject.ParentProperty.DependencyProperty; }
}
#endregion
}
}

54
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlParser.cs

@ -183,6 +183,10 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -183,6 +183,10 @@ namespace ICSharpCode.WpfDesign.XamlDom
XamlObject obj = new XamlObject(document, element, elementType, instance);
currentXamlObject = obj;
obj.ParentObject = parentXamlObject;
if (parentXamlObject == null && obj.DependencyObject != null) {
NameScope.SetNameScope(obj.DependencyObject, new NameScope());
}
ISupportInitialize iSupportInitializeInstance = instance as ISupportInitialize;
if (iSupportInitializeInstance != null) {
@ -275,7 +279,6 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -275,7 +279,6 @@ namespace ICSharpCode.WpfDesign.XamlDom
throw new XamlLoadException("This element does not have a default value, cannot assign to it");
}
obj.AddProperty(new XamlProperty(obj, defaultProperty, setDefaultValueTo));
defaultProperty.SetValue(obj.Instance, setDefaultValueTo.GetValueFor(defaultProperty));
}
}
@ -393,10 +396,10 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -393,10 +396,10 @@ namespace ICSharpCode.WpfDesign.XamlDom
}
}
XamlPropertyInfo GetPropertyInfo(object elementInstance, Type elementType, XmlAttribute attribute)
static XamlPropertyInfo GetPropertyInfo(object elementInstance, Type elementType, XmlAttribute attribute, XamlTypeFinder typeFinder)
{
if (attribute.LocalName.Contains(".")) {
return GetPropertyInfo(settings.TypeFinder, elementInstance, elementType, GetAttributeNamespace(attribute), attribute.LocalName);
return GetPropertyInfo(typeFinder, elementInstance, elementType, GetAttributeNamespace(attribute), attribute.LocalName);
} else {
return FindProperty(elementInstance, elementType, attribute.LocalName);
}
@ -423,12 +426,29 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -423,12 +426,29 @@ namespace ICSharpCode.WpfDesign.XamlDom
propertyName = qualifiedName.Substring(pos + 1);
}
void ParseObjectAttribute(XamlObject obj, XmlAttribute attribute)
static void ParseObjectAttribute(XamlObject obj, XmlAttribute attribute)
{
ParseObjectAttribute(obj, attribute, true);
}
internal static void ParseObjectAttribute(XamlObject obj, XmlAttribute attribute, bool real)
{
XamlPropertyInfo propertyInfo = GetPropertyInfo(obj.Instance, obj.ElementType, attribute);
XamlTextValue textValue = new XamlTextValue(document, attribute);
obj.AddProperty(new XamlProperty(obj, propertyInfo, textValue));
propertyInfo.SetValue(obj.Instance, textValue.GetValueFor(propertyInfo));
XamlPropertyInfo propertyInfo = GetPropertyInfo(obj.Instance, obj.ElementType, attribute, obj.OwnerDocument.TypeFinder);
XamlPropertyValue value = null;
var valueText = attribute.Value;
if (valueText.StartsWith("{") && !valueText.StartsWith("{}")) {
var xamlObject = MarkupExtensionParser.Parse(valueText, obj, real ? attribute : null);
value = xamlObject;
} else {
if (real)
value = new XamlTextValue(obj.OwnerDocument, attribute);
else
value = new XamlTextValue(obj.OwnerDocument, valueText);
}
var property = new XamlProperty(obj, propertyInfo, value);
obj.AddProperty(property);
}
static bool ObjectChildElementIsPropertyElement(XmlElement element)
@ -482,12 +502,28 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -482,12 +502,28 @@ namespace ICSharpCode.WpfDesign.XamlDom
XamlProperty xp = new XamlProperty(obj, propertyInfo, childValue);
xp.ParserSetPropertyElement(element);
obj.AddProperty(xp);
propertyInfo.SetValue(obj.Instance, childValue.GetValueFor(propertyInfo));
}
}
}
currentXmlSpace = oldXmlSpace;
}
internal static object CreateObjectFromAttributeText(string valueText, XamlPropertyInfo targetProperty, XamlObject scope)
{
return targetProperty.TypeConverter.ConvertFromString(
scope.OwnerDocument.GetTypeDescriptorContext(scope),
CultureInfo.InvariantCulture, valueText);
}
internal static object CreateObjectFromAttributeText(string valueText, Type targetType, XamlObject scope)
{
var converter =
XamlNormalPropertyInfo.GetCustomTypeConverter(targetType) ??
TypeDescriptor.GetConverter(targetType);
return converter.ConvertFromInvariantString(
scope.OwnerDocument.GetTypeDescriptorContext(scope), valueText);
}
}
}

259
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlProperty.cs

@ -12,6 +12,7 @@ using System.Diagnostics; @@ -12,6 +12,7 @@ using System.Diagnostics;
using System.Text;
using System.Xml;
using System.Windows;
using System.Windows.Markup;
namespace ICSharpCode.WpfDesign.XamlDom
{
@ -34,10 +35,14 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -34,10 +35,14 @@ namespace ICSharpCode.WpfDesign.XamlDom
internal XamlProperty(XamlObject parentObject, XamlPropertyInfo propertyInfo, XamlPropertyValue propertyValue)
: this(parentObject, propertyInfo)
{
PossiblyNameChanged(null, propertyValue);
this.propertyValue = propertyValue;
if (propertyValue != null) {
propertyValue.ParentProperty = this;
}
UpdateValueOnInstance();
}
internal XamlProperty(XamlObject parentObject, XamlPropertyInfo propertyInfo)
@ -112,22 +117,94 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -112,22 +117,94 @@ namespace ICSharpCode.WpfDesign.XamlDom
/// </summary>
public XamlPropertyValue PropertyValue {
get { return propertyValue; }
set {
if (IsCollection) {
throw new InvalidOperationException("Cannot set the value of collection properties.");
set { SetPropertyValue(value); }
}
/// <summary>
/// Gets if the property is a collection property.
/// </summary>
public bool IsCollection {
get { return isCollection; }
}
/// <summary>
/// Gets the collection elements of the property. Is empty if the property is not a collection.
/// </summary>
public IList<XamlPropertyValue> CollectionElements {
get { return collectionElements ?? emptyCollectionElementsArray; }
}
/// <summary>
/// Gets if the property is set.
/// </summary>
public bool IsSet {
get { return propertyValue != null || collectionElements != null; }
}
/// <summary>
/// Occurs when the value of the IsSet property has changed.
/// </summary>
public event EventHandler IsSetChanged;
/// <summary>
/// Occurs when the value of the property has changed.
/// </summary>
public event EventHandler ValueChanged;
void SetPropertyValue(XamlPropertyValue value)
{
if (IsCollection) {
throw new InvalidOperationException("Cannot set the value of collection properties.");
}
bool wasSet = this.IsSet;
PossiblyNameChanged(propertyValue, value);
ResetInternal();
propertyValue = value;
propertyValue.ParentProperty = this;
propertyValue.AddNodeTo(this);
UpdateValueOnInstance();
ParentObject.OnPropertyChanged(this);
if (!wasSet) {
if (IsSetChanged != null) {
IsSetChanged(this, EventArgs.Empty);
}
}
if (ValueChanged != null) {
ValueChanged(this, EventArgs.Empty);
}
}
internal void UpdateValueOnInstance()
{
if (PropertyValue != null) {
try {
ValueOnInstance = PropertyValue.GetValueFor(propertyInfo);
}
catch {
Debug.WriteLine("UpdateValueOnInstance() failed");
}
}
}
/// <summary>
/// Resets the properties value.
/// </summary>
public void Reset()
{
if (IsSet) {
bool wasSet = this.IsSet;
propertyInfo.ResetValue(parentObject.Instance);
ResetInternal();
propertyValue = value;
propertyValue.AddNodeTo(this);
propertyValue.ParentProperty = this;
ParentObject.OnPropertyChanged(this);
if (!wasSet) {
if (IsSetChanged != null) {
IsSetChanged(this, EventArgs.Empty);
}
if (IsSetChanged != null) {
IsSetChanged(this, EventArgs.Empty);
}
if (ValueChanged != null) {
ValueChanged(this, EventArgs.Empty);
@ -135,6 +212,19 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -135,6 +212,19 @@ namespace ICSharpCode.WpfDesign.XamlDom
}
}
void ResetInternal()
{
if (propertyValue != null) {
propertyValue.RemoveNodeFromParent();
propertyValue.ParentProperty = null;
propertyValue = null;
}
if (_propertyElement != null) {
_propertyElement.ParentNode.RemoveChild(_propertyElement);
_propertyElement = null;
}
}
XmlElement _propertyElement;
internal void ParserSetPropertyElement(XmlElement propertyElement)
@ -200,68 +290,39 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -200,68 +290,39 @@ namespace ICSharpCode.WpfDesign.XamlDom
collection.InsertBefore(newChildNode, collectionElements[index].GetNodeForCollection());
}
}
/// <summary>
/// Gets if the property is a collection property.
/// </summary>
public bool IsCollection {
get { return isCollection; }
}
/// <summary>
/// Gets the collection elements of the property. Is empty if the property is not a collection.
/// </summary>
public IList<XamlPropertyValue> CollectionElements {
get { return collectionElements ?? emptyCollectionElementsArray; }
}
/// <summary>
/// Gets if the property is set.
/// </summary>
public bool IsSet {
get { return propertyValue != null || collectionElements != null; }
}
/// <summary>
/// Occurs when the value of the IsSet property has changed.
/// </summary>
public event EventHandler IsSetChanged;
/// <summary>
/// Occurs when the value of the property has changed.
/// </summary>
public event EventHandler ValueChanged;
/// <summary>
/// Resets the properties value.
/// </summary>
public void Reset()
internal XmlAttribute SetAttribute(string value)
{
if (IsSet) {
propertyInfo.ResetValue(parentObject.Instance);
ResetInternal();
if (IsSetChanged != null) {
IsSetChanged(this, EventArgs.Empty);
}
if (ValueChanged != null) {
ValueChanged(this, EventArgs.Empty);
}
string ns = ParentObject.OwnerDocument.GetNamespaceFor(PropertyTargetType);
string name;
if (IsAttached)
name = PropertyTargetType.Name + "." + PropertyName;
else
name = PropertyName;
var element = ParentObject.XmlElement;
if (element.GetPrefixOfNamespace(ns) == "") {
element.SetAttribute(name, value);
return element.GetAttributeNode(name);
} else {
element.SetAttribute(name, ns, value);
return element.GetAttributeNode(name, ns);
}
}
void ResetInternal()
internal string GetNameForMarkupExtension()
{
if (propertyValue != null) {
propertyValue.RemoveNodeFromParent();
propertyValue.ParentProperty = null;
propertyValue = null;
}
if (_propertyElement != null) {
_propertyElement.ParentNode.RemoveChild(_propertyElement);
_propertyElement = null;
}
string name;
if (IsAttached)
name = PropertyTargetType.Name + "." + PropertyName;
else
name = PropertyName;
var element = ParentObject.XmlElement;
string ns = ParentObject.OwnerDocument.GetNamespaceFor(PropertyTargetType);
var prefix = element.GetPrefixOfNamespace(ns);
if (prefix == "") return name;
return prefix + ":" + name;
}
/// <summary>
@ -299,6 +360,54 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -299,6 +360,54 @@ namespace ICSharpCode.WpfDesign.XamlDom
propertyInfo.SetValue(parentObject.Instance, value);
}
}
public bool IsAdvanced {
get { return propertyInfo.IsAdvanced; }
}
public DependencyProperty DependencyProperty {
get {
return propertyInfo.DependencyProperty;
}
}
void PossiblyNameChanged(XamlPropertyValue oldValue, XamlPropertyValue newValue)
{
if (PropertyName == "Name" && ReturnType == typeof(string)) {
string oldName = null;
string newName = null;
var oldTextValue = oldValue as XamlTextValue;
if (oldTextValue != null) oldName = oldTextValue.Text;
var newTextValue = newValue as XamlTextValue;
if (newTextValue != null) newName = newTextValue.Text;
var obj = ParentObject;
while (obj != null) {
var nameScope = obj.Instance as INameScope;
if (nameScope == null) {
if (obj.DependencyObject != null)
nameScope = NameScope.GetNameScope(obj.DependencyObject);
}
if (nameScope != null) {
if (oldName != null) {
nameScope.UnregisterName(oldName);
}
if (newName != null) {
nameScope.RegisterName(newName, ParentObject.Instance);
}
break;
}
obj = obj.ParentObject;
}
}
}
void PossiblyMarkupExtensionChanged(XamlPropertyValue part)
{
}
/*public bool IsAttributeSyntax {
get {
@ -317,15 +426,5 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -317,15 +426,5 @@ namespace ICSharpCode.WpfDesign.XamlDom
return attribute == null && element == null;
}
}*/
public bool IsAdvanced {
get { return propertyInfo.IsAdvanced; }
}
public DependencyProperty DependencyProperty {
get {
return propertyInfo.DependencyProperty;
}
}
}
}

43
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlTextValue.cs

@ -113,34 +113,11 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -113,34 +113,11 @@ namespace ICSharpCode.WpfDesign.XamlDom
{
if (ParentProperty == null)
throw new InvalidOperationException("Cannot call GetValueFor while ParentProperty is null");
if (attribute != null) {
return AttributeTextToObject(attribute.Value, ParentProperty.ParentObject,
targetProperty != null ? targetProperty.TypeConverter : XamlNormalPropertyInfo.StringTypeConverter);
}
if (targetProperty == null)
return this.Text;
return targetProperty.TypeConverter.ConvertFromString(
document.GetTypeDescriptorContext(ParentProperty.ParentObject),
CultureInfo.InvariantCulture, this.Text);
}
internal static object AttributeTextToObject(string attributeText, XamlObject containingObject,
TypeConverter typeConverter)
{
if (attributeText.StartsWith("{}")) {
return typeConverter.ConvertFromString(
containingObject.OwnerDocument.GetTypeDescriptorContext(containingObject), CultureInfo.InvariantCulture,
attributeText.Substring(2));
} else if (attributeText.StartsWith("{")) {
XamlTypeResolverProvider xtrp = new XamlTypeResolverProvider(containingObject);
MarkupExtension extension = MarkupExtensionParser.ConstructMarkupExtension(
attributeText, containingObject, xtrp);
return extension.ProvideValue(xtrp);
} else {
return typeConverter.ConvertFromString(
containingObject.OwnerDocument.GetTypeDescriptorContext(containingObject), CultureInfo.InvariantCulture,
attributeText);
}
return XamlParser.CreateObjectFromAttributeText(Text, targetProperty, ParentProperty.ParentObject);
}
internal override void RemoveNodeFromParent()
@ -158,19 +135,7 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -158,19 +135,7 @@ namespace ICSharpCode.WpfDesign.XamlDom
if (attribute != null) {
property.ParentObject.XmlElement.Attributes.Append(attribute);
} else if (textValue != null) {
string ns = property.ParentObject.OwnerDocument.GetNamespaceFor(property.PropertyTargetType);
string name;
if (property.IsAttached)
name = property.PropertyTargetType.Name + "." + property.PropertyName;
else
name = property.PropertyName;
if (property.ParentObject.XmlElement.GetPrefixOfNamespace(ns) == "") {
property.ParentObject.XmlElement.SetAttribute(name, textValue);
attribute = property.ParentObject.XmlElement.GetAttributeNode(name);
} else {
property.ParentObject.XmlElement.SetAttribute(name, ns, textValue);
attribute = property.ParentObject.XmlElement.GetAttributeNode(name, ns);
}
attribute = property.SetAttribute(textValue);
textValue = null;
} else if (cDataSection != null) {
property.AddChildNodeToProperty(cDataSection);

14
src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlTypeResolverProvider.cs

@ -21,7 +21,6 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -21,7 +21,6 @@ namespace ICSharpCode.WpfDesign.XamlDom
{
XamlDocument document;
XamlObject containingObject;
XmlElement containingElement;
public XamlTypeResolverProvider(XamlObject containingObject)
{
@ -29,7 +28,10 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -29,7 +28,10 @@ namespace ICSharpCode.WpfDesign.XamlDom
throw new ArgumentNullException("containingObject");
this.document = containingObject.OwnerDocument;
this.containingObject = containingObject;
this.containingElement = containingObject.XmlElement;
}
XmlElement ContainingElement{
get { return containingObject.XmlElement; }
}
public Type Resolve(string typeName)
@ -37,10 +39,10 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -37,10 +39,10 @@ namespace ICSharpCode.WpfDesign.XamlDom
string typeNamespaceUri;
string typeLocalName;
if (typeName.Contains(":")) {
typeNamespaceUri = containingElement.GetNamespaceOfPrefix(typeName.Substring(0, typeName.IndexOf(':')));
typeNamespaceUri = ContainingElement.GetNamespaceOfPrefix(typeName.Substring(0, typeName.IndexOf(':')));
typeLocalName = typeName.Substring(typeName.IndexOf(':') + 1);
} else {
typeNamespaceUri = containingElement.NamespaceURI;
typeNamespaceUri = ContainingElement.GetNamespaceOfPrefix("");
typeLocalName = typeName;
}
if (string.IsNullOrEmpty(typeNamespaceUri))
@ -60,10 +62,10 @@ namespace ICSharpCode.WpfDesign.XamlDom @@ -60,10 +62,10 @@ namespace ICSharpCode.WpfDesign.XamlDom
{
string propertyNamespace;
if (propertyName.Contains(":")) {
propertyNamespace = containingElement.GetNamespaceOfPrefix(propertyName.Substring(0, propertyName.IndexOf(':')));
propertyNamespace = ContainingElement.GetNamespaceOfPrefix(propertyName.Substring(0, propertyName.IndexOf(':')));
propertyName = propertyName.Substring(propertyName.IndexOf(':') + 1);
} else {
propertyNamespace = containingElement.NamespaceURI;
propertyNamespace = ContainingElement.GetNamespaceOfPrefix("");
}
Type elementType = null;
XamlObject obj = containingObject;

19
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/Metadata.cs

@ -9,12 +9,6 @@ using System.ComponentModel; @@ -9,12 +9,6 @@ using System.ComponentModel;
namespace ICSharpCode.WpfDesign
{
public class NumberRange
{
public double Min;
public double Max;
}
public static class Metadata
{
public static string GetFullName(this DependencyProperty p)
@ -95,6 +89,13 @@ namespace ICSharpCode.WpfDesign @@ -95,6 +89,13 @@ namespace ICSharpCode.WpfDesign
}
}
public static void AddAdvancedProperty(Type type, string member)
{
lock (advancedProperties) {
advancedProperties.Add(type.FullName + "." + member);
}
}
public static bool IsAdvanced(DesignItemProperty p)
{
lock (advancedProperties) {
@ -127,4 +128,10 @@ namespace ICSharpCode.WpfDesign @@ -127,4 +128,10 @@ namespace ICSharpCode.WpfDesign
return null;
}
}
public class NumberRange
{
public double Min;
public double Max;
}
}

40
src/AddIns/DisplayBindings/WpfDesign/WpfDesign/Project/PropertyGrid/PropertyNode.cs

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@ -21,6 +21,7 @@ namespace ICSharpCode.WpfDesign.PropertyGrid @@ -21,6 +21,7 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
{
this.Properties = properties;
this.Parent = parent;
this.Level = parent == null ? 0 : parent.Level + 1;
foreach (var property in properties) {
property.ValueChanged += new EventHandler(property_ValueChanged);
@ -28,6 +29,7 @@ namespace ICSharpCode.WpfDesign.PropertyGrid @@ -28,6 +29,7 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
Editor = EditorManager.CreateEditor(FirstProperty);
Children = new ObservableCollection<PropertyNode>();
MoreChildren = new ObservableCollection<PropertyNode>();
UpdateChildren();
}
@ -50,7 +52,9 @@ namespace ICSharpCode.WpfDesign.PropertyGrid @@ -50,7 +52,9 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
public DesignItemProperty FirstProperty { get { return Properties[0]; } }
public PropertyNode Parent { get; private set; }
public int Level { get; private set; }
public ObservableCollection<PropertyNode> Children { get; private set; }
public ObservableCollection<PropertyNode> MoreChildren { get; private set; }
bool isExpanded;
@ -60,10 +64,15 @@ namespace ICSharpCode.WpfDesign.PropertyGrid @@ -60,10 +64,15 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
}
set {
isExpanded = value;
UpdateChildren();
RaisePropertyChanged("IsExpanded");
}
}
public bool HasChildren {
get { return Children.Count > 0 || MoreChildren.Count > 0; }
}
public object Description {
get {
IPropertyDescriptionService s = Services.GetService<IPropertyDescriptionService>();
@ -132,6 +141,7 @@ namespace ICSharpCode.WpfDesign.PropertyGrid @@ -132,6 +141,7 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
public void CreateBinding()
{
Value = new Binding();
IsExpanded = true;
}
void SetValueCore(object value)
@ -165,21 +175,27 @@ namespace ICSharpCode.WpfDesign.PropertyGrid @@ -165,21 +175,27 @@ namespace ICSharpCode.WpfDesign.PropertyGrid
void UpdateChildren()
{
Children.Clear();
MoreChildren.Clear();
if (Parent == null || Parent.IsExpanded) {
if (IsAmbiguous || FirstProperty.IsCollection || FirstProperty.Value == null) {
return;
}
var item = FirstProperty.Value;
var list = TypeHelper.GetAvailableProperties(item.ComponentType)
.OrderBy(d => d.Name)
.Select(d => new PropertyNode(new[] { item.Properties[d.Name] }, this));
foreach (var node in list) {
Children.Add(node);
if (IsAmbiguous || FirstProperty.IsCollection || FirstProperty.Value == null) {}
else {
var item = FirstProperty.Value;
var list = TypeHelper.GetAvailableProperties(item.ComponentType)
.OrderBy(d => d.Name)
.Select(d => new PropertyNode(new[] { item.Properties[d.Name] }, this));
foreach (var node in list) {
if (Metadata.IsAdvanced(node.FirstProperty)) {
MoreChildren.Add(node);
} else {
Children.Add(node);
}
}
}
}
RaisePropertyChanged("HasChildren");
}
#region INotifyPropertyChanged Members

Loading…
Cancel
Save