|
|
|
@ -12,7 +12,7 @@ using System.Collections.ObjectModel; |
|
|
|
using System.ComponentModel; |
|
|
|
using System.ComponentModel; |
|
|
|
using System.Windows; |
|
|
|
using System.Windows; |
|
|
|
using System.Linq; |
|
|
|
using System.Linq; |
|
|
|
using ICSharpCode.WpfDesign.Designer.Xaml; |
|
|
|
using ICSharpCode.WpfDesign.Designer.Xaml; |
|
|
|
using ICSharpCode.WpfDesign.XamlDom; |
|
|
|
using ICSharpCode.WpfDesign.XamlDom; |
|
|
|
|
|
|
|
|
|
|
|
namespace ICSharpCode.WpfDesign.Designer.OutlineView |
|
|
|
namespace ICSharpCode.WpfDesign.Designer.OutlineView |
|
|
|
@ -21,219 +21,205 @@ namespace ICSharpCode.WpfDesign.Designer.OutlineView |
|
|
|
/// Description of OutlineNodeBase.
|
|
|
|
/// Description of OutlineNodeBase.
|
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
public abstract class OutlineNodeBase : INotifyPropertyChanged, IOutlineNode |
|
|
|
public abstract class OutlineNodeBase : INotifyPropertyChanged, IOutlineNode |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
protected abstract void UpdateChildren(); |
|
|
|
protected abstract void UpdateChildren(); |
|
|
|
//Used to check if element can enter other containers
|
|
|
|
//Used to check if element can enter other containers
|
|
|
|
protected static PlacementType DummyPlacementType; |
|
|
|
protected static PlacementType DummyPlacementType; |
|
|
|
|
|
|
|
|
|
|
|
protected OutlineNodeBase(DesignItem designItem) |
|
|
|
protected OutlineNodeBase(DesignItem designItem) |
|
|
|
{ |
|
|
|
{ |
|
|
|
DesignItem = designItem; |
|
|
|
DesignItem = designItem; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var hidden = designItem.Properties.GetAttachedProperty(DesignTimeProperties.IsHiddenProperty).ValueOnInstance; |
|
|
|
var hidden = designItem.Properties.GetAttachedProperty(DesignTimeProperties.IsHiddenProperty).ValueOnInstance; |
|
|
|
if (hidden != null && (bool)hidden) |
|
|
|
if (hidden != null && (bool)hidden) { |
|
|
|
{ |
|
|
|
_isDesignTimeVisible = false; |
|
|
|
_isDesignTimeVisible = false; |
|
|
|
((FrameworkElement)DesignItem.Component).Visibility = Visibility.Hidden; |
|
|
|
((FrameworkElement)DesignItem.Component).Visibility = Visibility.Hidden; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var locked = designItem.Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).ValueOnInstance; |
|
|
|
var locked = designItem.Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).ValueOnInstance; |
|
|
|
if (locked != null && (bool)locked) { |
|
|
|
if (locked != null && (bool)locked) |
|
|
|
_isDesignTimeLocked = true; |
|
|
|
{ |
|
|
|
} |
|
|
|
_isDesignTimeLocked = true; |
|
|
|
|
|
|
|
} |
|
|
|
//TODO
|
|
|
|
|
|
|
|
|
|
|
|
//TODO
|
|
|
|
DesignItem.NameChanged += new EventHandler(DesignItem_NameChanged); |
|
|
|
|
|
|
|
DesignItem.PropertyChanged += new PropertyChangedEventHandler(DesignItem_PropertyChanged); |
|
|
|
DesignItem.NameChanged += new EventHandler(DesignItem_NameChanged); |
|
|
|
} |
|
|
|
DesignItem.PropertyChanged += new PropertyChangedEventHandler(DesignItem_PropertyChanged); |
|
|
|
|
|
|
|
} |
|
|
|
public DesignItem DesignItem { get; set; } |
|
|
|
|
|
|
|
|
|
|
|
public DesignItem DesignItem { get; set; } |
|
|
|
public ISelectionService SelectionService |
|
|
|
|
|
|
|
{ |
|
|
|
public ISelectionService SelectionService |
|
|
|
get { return DesignItem.Services.Selection; } |
|
|
|
{ |
|
|
|
} |
|
|
|
get { return DesignItem.Services.Selection; } |
|
|
|
|
|
|
|
} |
|
|
|
bool isExpanded = true; |
|
|
|
|
|
|
|
|
|
|
|
bool isExpanded = true; |
|
|
|
public bool IsExpanded |
|
|
|
|
|
|
|
{ |
|
|
|
public bool IsExpanded |
|
|
|
get |
|
|
|
{ |
|
|
|
{ |
|
|
|
get |
|
|
|
return isExpanded; |
|
|
|
{ |
|
|
|
} |
|
|
|
return isExpanded; |
|
|
|
set |
|
|
|
} |
|
|
|
{ |
|
|
|
set |
|
|
|
isExpanded = value; |
|
|
|
{ |
|
|
|
RaisePropertyChanged("IsExpanded"); |
|
|
|
isExpanded = value; |
|
|
|
} |
|
|
|
RaisePropertyChanged("IsExpanded"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
bool isSelected; |
|
|
|
|
|
|
|
|
|
|
|
bool isSelected; |
|
|
|
public bool IsSelected |
|
|
|
|
|
|
|
{ |
|
|
|
public bool IsSelected |
|
|
|
get |
|
|
|
{ |
|
|
|
{ |
|
|
|
get |
|
|
|
return isSelected; |
|
|
|
{ |
|
|
|
} |
|
|
|
return isSelected; |
|
|
|
set |
|
|
|
} |
|
|
|
{ |
|
|
|
set |
|
|
|
if (isSelected != value) { |
|
|
|
{ |
|
|
|
isSelected = value; |
|
|
|
if (isSelected != value) |
|
|
|
SelectionService.SetSelectedComponents(new[] { DesignItem }, |
|
|
|
{ |
|
|
|
value ? SelectionTypes.Add : SelectionTypes.Remove); |
|
|
|
isSelected = value; |
|
|
|
RaisePropertyChanged("IsSelected"); |
|
|
|
SelectionService.SetSelectedComponents(new[] { DesignItem }, |
|
|
|
} |
|
|
|
value ? SelectionTypes.Add : SelectionTypes.Remove); |
|
|
|
} |
|
|
|
RaisePropertyChanged("IsSelected"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
bool _isDesignTimeVisible = true; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public bool IsDesignTimeVisible |
|
|
|
bool _isDesignTimeVisible = true; |
|
|
|
{ |
|
|
|
|
|
|
|
get |
|
|
|
public bool IsDesignTimeVisible |
|
|
|
{ |
|
|
|
{ |
|
|
|
return _isDesignTimeVisible; |
|
|
|
get |
|
|
|
} |
|
|
|
{ |
|
|
|
set |
|
|
|
return _isDesignTimeVisible; |
|
|
|
{ |
|
|
|
} |
|
|
|
_isDesignTimeVisible = value; |
|
|
|
set |
|
|
|
var ctl = DesignItem.Component as UIElement; |
|
|
|
{ |
|
|
|
if(ctl!=null) |
|
|
|
_isDesignTimeVisible = value; |
|
|
|
ctl.Visibility = _isDesignTimeVisible ? Visibility.Visible : Visibility.Hidden; |
|
|
|
var ctl = DesignItem.Component as UIElement; |
|
|
|
|
|
|
|
if(ctl!=null) |
|
|
|
RaisePropertyChanged("IsDesignTimeVisible"); |
|
|
|
ctl.Visibility = _isDesignTimeVisible ? Visibility.Visible : Visibility.Hidden; |
|
|
|
|
|
|
|
|
|
|
|
if (!value) |
|
|
|
RaisePropertyChanged("IsDesignTimeVisible"); |
|
|
|
DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsHiddenProperty).SetValue(true); |
|
|
|
|
|
|
|
else |
|
|
|
if (!value) |
|
|
|
DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsHiddenProperty).Reset(); |
|
|
|
DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsHiddenProperty).SetValue(true); |
|
|
|
} |
|
|
|
else |
|
|
|
} |
|
|
|
DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsHiddenProperty).Reset(); |
|
|
|
|
|
|
|
} |
|
|
|
bool _isDesignTimeLocked = false; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public bool IsDesignTimeLocked |
|
|
|
bool _isDesignTimeLocked = false; |
|
|
|
{ |
|
|
|
|
|
|
|
get |
|
|
|
public bool IsDesignTimeLocked |
|
|
|
{ |
|
|
|
{ |
|
|
|
return _isDesignTimeLocked; |
|
|
|
get |
|
|
|
} |
|
|
|
{ |
|
|
|
set |
|
|
|
return _isDesignTimeLocked; |
|
|
|
{ |
|
|
|
} |
|
|
|
_isDesignTimeLocked = value; |
|
|
|
set |
|
|
|
((XamlDesignItem)DesignItem).IsDesignTimeLocked = _isDesignTimeLocked; |
|
|
|
{ |
|
|
|
|
|
|
|
_isDesignTimeLocked = value; |
|
|
|
RaisePropertyChanged("IsDesignTimeLocked"); |
|
|
|
((XamlDesignItem)DesignItem).IsDesignTimeLocked = _isDesignTimeLocked; |
|
|
|
|
|
|
|
|
|
|
|
// if (value)
|
|
|
|
RaisePropertyChanged("IsDesignTimeLocked"); |
|
|
|
// DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).SetValue(true);
|
|
|
|
|
|
|
|
// else
|
|
|
|
// if (value)
|
|
|
|
// DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).Reset();
|
|
|
|
// DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).SetValue(true);
|
|
|
|
} |
|
|
|
// else
|
|
|
|
} |
|
|
|
// DesignItem.Properties.GetAttachedProperty(DesignTimeProperties.IsLockedProperty).Reset();
|
|
|
|
|
|
|
|
} |
|
|
|
ObservableCollection<IOutlineNode> children = new ObservableCollection<IOutlineNode>(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public ObservableCollection<IOutlineNode> Children |
|
|
|
ObservableCollection<IOutlineNode> children = new ObservableCollection<IOutlineNode>(); |
|
|
|
{ |
|
|
|
|
|
|
|
get { return children; } |
|
|
|
public ObservableCollection<IOutlineNode> Children |
|
|
|
} |
|
|
|
{ |
|
|
|
|
|
|
|
get { return children; } |
|
|
|
public string Name |
|
|
|
} |
|
|
|
{ |
|
|
|
|
|
|
|
get |
|
|
|
public string Name |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (string.IsNullOrEmpty(DesignItem.Name)) { |
|
|
|
get |
|
|
|
return DesignItem.ComponentType.Name; |
|
|
|
{ |
|
|
|
} |
|
|
|
if (string.IsNullOrEmpty(DesignItem.Name)) |
|
|
|
return DesignItem.ComponentType.Name + " (" + DesignItem.Name + ")"; |
|
|
|
{ |
|
|
|
} |
|
|
|
return DesignItem.ComponentType.Name; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return DesignItem.ComponentType.Name + " (" + DesignItem.Name + ")"; |
|
|
|
void DesignItem_NameChanged(object sender, EventArgs e) |
|
|
|
} |
|
|
|
{ |
|
|
|
} |
|
|
|
RaisePropertyChanged("Name"); |
|
|
|
|
|
|
|
} |
|
|
|
void DesignItem_NameChanged(object sender, EventArgs e) |
|
|
|
|
|
|
|
{ |
|
|
|
void DesignItem_PropertyChanged(object sender, PropertyChangedEventArgs e) |
|
|
|
RaisePropertyChanged("Name"); |
|
|
|
{ |
|
|
|
} |
|
|
|
if (e.PropertyName == DesignItem.ContentPropertyName) { |
|
|
|
|
|
|
|
UpdateChildren(); |
|
|
|
void DesignItem_PropertyChanged(object sender, PropertyChangedEventArgs e) |
|
|
|
} |
|
|
|
{ |
|
|
|
} |
|
|
|
if (e.PropertyName == DesignItem.ContentPropertyName) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
UpdateChildren(); |
|
|
|
|
|
|
|
} |
|
|
|
public bool CanInsert(IEnumerable<IOutlineNode> nodes, IOutlineNode after, bool copy) |
|
|
|
} |
|
|
|
{ |
|
|
|
|
|
|
|
var placementBehavior = DesignItem.GetBehavior<IPlacementBehavior>(); |
|
|
|
|
|
|
|
if (placementBehavior == null) |
|
|
|
|
|
|
|
return false; |
|
|
|
public bool CanInsert(IEnumerable<IOutlineNode> nodes, IOutlineNode after, bool copy) |
|
|
|
var operation = PlacementOperation.Start(nodes.Select(node => node.DesignItem).ToArray(), DummyPlacementType); |
|
|
|
{ |
|
|
|
if (operation != null) { |
|
|
|
var placementBehavior = DesignItem.GetBehavior<IPlacementBehavior>(); |
|
|
|
bool canEnter = placementBehavior.CanEnterContainer(operation, true); |
|
|
|
if (placementBehavior == null) |
|
|
|
operation.Abort(); |
|
|
|
return false; |
|
|
|
return canEnter; |
|
|
|
var operation = PlacementOperation.Start(nodes.Select(node => node.DesignItem).ToArray(), DummyPlacementType); |
|
|
|
} |
|
|
|
if (operation != null) |
|
|
|
return false; |
|
|
|
{ |
|
|
|
} |
|
|
|
bool canEnter = placementBehavior.CanEnterContainer(operation, true); |
|
|
|
|
|
|
|
operation.Abort(); |
|
|
|
public virtual void Insert(IEnumerable<IOutlineNode> nodes, IOutlineNode after, bool copy) |
|
|
|
return canEnter; |
|
|
|
{ |
|
|
|
} |
|
|
|
using (var moveTransaction = DesignItem.Context.OpenGroup("Item moved in outline view", nodes.Select(n => n.DesignItem).ToList())) |
|
|
|
return false; |
|
|
|
{ |
|
|
|
} |
|
|
|
if (copy) { |
|
|
|
|
|
|
|
nodes = nodes.Select(n => OutlineNode.Create(n.DesignItem.Clone())).ToList(); |
|
|
|
public virtual void Insert(IEnumerable<IOutlineNode> nodes, IOutlineNode after, bool copy) |
|
|
|
} else { |
|
|
|
{ |
|
|
|
foreach (var node in nodes) { |
|
|
|
using (var moveTransaction = DesignItem.Context.OpenGroup("Item moved in outline view", nodes.Select(n => n.DesignItem).ToList())) |
|
|
|
node.DesignItem.Remove(); |
|
|
|
{ |
|
|
|
} |
|
|
|
if (copy) |
|
|
|
} |
|
|
|
{ |
|
|
|
|
|
|
|
nodes = nodes.Select(n => OutlineNode.Create(n.DesignItem.Clone())).ToList(); |
|
|
|
var index = after == null ? 0 : Children.IndexOf(after) + 1; |
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
var content = DesignItem.ContentProperty; |
|
|
|
{ |
|
|
|
if (content.IsCollection) { |
|
|
|
foreach (var node in nodes) |
|
|
|
foreach (var node in nodes) { |
|
|
|
{ |
|
|
|
content.CollectionElements.Insert(index++, node.DesignItem); |
|
|
|
node.DesignItem.Remove(); |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
} |
|
|
|
content.SetValue(nodes.First().DesignItem); |
|
|
|
|
|
|
|
} |
|
|
|
var index = after == null ? 0 : Children.IndexOf(after) + 1; |
|
|
|
moveTransaction.Commit(); |
|
|
|
|
|
|
|
} |
|
|
|
var content = DesignItem.ContentProperty; |
|
|
|
} |
|
|
|
if (content.IsCollection) |
|
|
|
|
|
|
|
{ |
|
|
|
#region INotifyPropertyChanged Members
|
|
|
|
foreach (var node in nodes) |
|
|
|
|
|
|
|
{ |
|
|
|
public event PropertyChangedEventHandler PropertyChanged; |
|
|
|
content.CollectionElements.Insert(index++, node.DesignItem); |
|
|
|
|
|
|
|
} |
|
|
|
public void RaisePropertyChanged(string name) |
|
|
|
} |
|
|
|
{ |
|
|
|
else |
|
|
|
if (PropertyChanged != null) |
|
|
|
{ |
|
|
|
{ |
|
|
|
content.SetValue(nodes.First().DesignItem); |
|
|
|
PropertyChanged(this, new PropertyChangedEventArgs(name)); |
|
|
|
} |
|
|
|
} |
|
|
|
moveTransaction.Commit(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
#endregion
|
|
|
|
|
|
|
|
} |
|
|
|
#region INotifyPropertyChanged Members
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public event PropertyChangedEventHandler PropertyChanged; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void RaisePropertyChanged(string name) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (PropertyChanged != null) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
PropertyChanged(this, new PropertyChangedEventArgs(name)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|