1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using System.Collections.Generic;
6
using System.Diagnostics;
7
using System.Globalization;
11
using System.Windows.Controls;
12
using System.Windows.Data;
13
using System.Windows.Documents;
14
using System.Windows.Input;
15
using System.Windows.Media;
16
using System.Windows.Shapes;
17
using System.Xml.Linq;
19
using ICSharpCode.Core;
20
using ICSharpCode.SharpDevelop;
22
namespace ICSharpCode.XamlBinding.PowerToys.Dialogs
25
/// Interaction logic for EditGridColumnsAndRowsDialog.xaml
27
public partial class EditGridColumnsAndRowsDialog : Window
29
readonly XName rowDefsName, colDefsName;
30
readonly XName rowDefName, colDefName;
32
readonly XName gridRowName = XName.Get("Grid.Row");
33
readonly XName gridColName = XName.Get("Grid.Column");
35
readonly string currentWpfNamespace;
38
XElement rowDefitions;
39
XElement colDefitions;
40
IList<XElement> additionalProperties;
42
bool gridLengthInvalid;
44
Stack<UndoStep> undoStack;
45
Stack<UndoStep> redoStack;
47
public EditGridColumnsAndRowsDialog(XElement gridTree)
49
InitializeComponent();
51
currentWpfNamespace = gridTree.GetCurrentNamespaces()
52
.First(i => CompletionDataHelper.WpfXamlNamespaces.Contains(i));
54
rowDefsName = XName.Get("Grid.RowDefinitions", currentWpfNamespace);
55
colDefsName = XName.Get("Grid.ColumnDefinitions", currentWpfNamespace);
57
rowDefName = XName.Get("RowDefinition", currentWpfNamespace);
58
colDefName = XName.Get("ColumnDefinition", currentWpfNamespace);
60
this.gridTree = gridTree;
61
this.rowDefitions = gridTree.Element(rowDefsName) ?? new XElement(rowDefsName);
62
this.colDefitions = gridTree.Element(colDefsName) ?? new XElement(colDefsName);
64
if (this.rowDefitions.Parent != null)
65
this.rowDefitions.Remove();
66
if (this.colDefitions.Parent != null)
67
this.colDefitions.Remove();
69
foreach (var height in this.rowDefitions.Elements().Select(row => row.Attribute("Height"))) {
70
if (height.Value.Trim() == "1*")
73
height.Value = height.Value.Trim();
76
foreach (var width in this.colDefitions.Elements().Select(col => col.Attribute("Width"))) {
77
if (width.Value.Trim() == "1*")
80
width.Value = width.Value.Trim();
83
this.additionalProperties = gridTree.Elements().Where(e => e.Name.LocalName.Contains(".")).ToList();
84
this.additionalProperties.ForEach(item => { if (item.Parent != null) item.Remove(); });
86
this.redoStack = new Stack<UndoStep>();
87
this.undoStack = new Stack<UndoStep>();
89
CommandBindings.Add(new CommandBinding(ApplicationCommands.Undo, delegate { UndoItemClick(null, null); }));
90
CommandBindings.Add(new CommandBinding(ApplicationCommands.Redo, delegate { RedoItemClick(null, null); }));
92
int maxCols = Math.Max(this.colDefitions.Elements().Count(), 1);
93
int maxRows = Math.Max(this.rowDefitions.Elements().Count(), 1);
95
this.gridTree.Elements().ForEach(el => NormalizeElementGridIndices(el, maxCols, maxRows));
100
void NormalizeElementGridIndices(XElement element, int maxCols, int maxRows)
102
XAttribute a = element.Attribute(gridColName);
103
XAttribute b = element.Attribute(gridRowName);
105
if (a != null && int.TryParse(a.Value, out value))
106
element.SetAttributeValue(gridColName, Utils.MinMax(value, 0, maxCols - 1));
108
element.SetAttributeValue(gridColName, 0);
109
if (b != null && int.TryParse(b.Value, out value))
110
element.SetAttributeValue(gridRowName, Utils.MinMax(value, 0, maxRows - 1));
112
element.SetAttributeValue(gridRowName, 0);
115
static MenuItem CreateItem(string header, Action<StackPanel> clickAction, StackPanel senderItem)
117
MenuItem item = new MenuItem();
119
item.Header = header;
120
item.Click += delegate { clickAction(senderItem); };
125
static MenuItem CreateItem(string header, Action<int, int> clickAction, int cellIndex)
127
MenuItem item = new MenuItem();
129
item.Header = header;
130
item.Click += delegate { clickAction(cellIndex, 1); };
135
void InsertAbove(StackPanel block)
137
UpdateUndoRedoState();
139
int row = (int)block.GetValue(Grid.RowProperty);
141
var newRow = new XElement(rowDefName);
142
newRow.SetAttributeValue(XName.Get("Height"), "*");
143
var items = rowDefitions.Elements().Skip(row);
144
var selItem = items.FirstOrDefault();
146
selItem.AddBeforeSelf(newRow);
148
rowDefitions.Add(newRow);
150
var controls = gridTree
154
var rowAttrib = element.Attribute(gridRowName) ?? new XAttribute(gridRowName, 0);
155
int rowAttribValue = 0;
156
if (int.TryParse(rowAttrib.Value, out rowAttribValue))
157
return rowAttribValue >= row;
163
controls.ForEach(item => MoveRowItem(item, 1));
168
void InsertBelow(StackPanel block)
170
UpdateUndoRedoState();
172
int row = (int)block.GetValue(Grid.RowProperty);
174
var newRow = new XElement(rowDefName);
175
newRow.SetAttributeValue(XName.Get("Height"), "*");
176
var items = rowDefitions.Elements().Skip(row);
177
var selItem = items.FirstOrDefault();
179
selItem.AddAfterSelf(newRow);
181
rowDefitions.Add(newRow);
183
var controls = gridTree
187
var rowAttrib = element.Attribute(gridRowName) ?? new XAttribute(gridRowName, 0);
188
int rowAttribValue = 0;
189
if (int.TryParse(rowAttrib.Value, out rowAttribValue))
190
return rowAttribValue > row;
196
controls.ForEach(item => MoveRowItem(item, 1));
201
void MoveUp(int row, int steps)
203
if (steps < 1 || row - steps < 0)
206
UpdateUndoRedoState();
208
var selItem = rowDefitions.Elements().Skip(row).FirstOrDefault();
213
var before = rowDefitions.Elements().Skip(row - steps).FirstOrDefault();
216
before.AddBeforeSelf(selItem);
218
var controls = gridTree.Elements().Where(element => IsSameRow(element, row)).ToList();
220
var controlsDown = gridTree.Elements()
223
var rowAttrib = element2.Attribute(gridRowName) ?? new XAttribute(gridRowName, 0);
224
int rowAttribValue = 0;
225
if (int.TryParse(rowAttrib.Value, out rowAttribValue))
226
return rowAttribValue < row && rowAttribValue >= (row - steps);
232
controls.ForEach(item => MoveRowItem(item, -steps));
233
controlsDown.ForEach(item2 => MoveRowItem(item2, 1));
238
bool IsSameRow(XElement element, int row)
240
var rowAttrib = element.Attribute(gridRowName) ?? new XAttribute(gridRowName, 0);
241
int rowAttribValue = 0;
242
if (int.TryParse(rowAttrib.Value, out rowAttribValue))
243
return rowAttribValue == row;
248
void MoveDown(int row, int steps)
250
if (steps < 1 || row + steps > rowDefitions.Elements().Count())
253
UpdateUndoRedoState();
255
var selItem = rowDefitions.Elements().Skip(row).FirstOrDefault();
259
var before = rowDefitions.Elements().Skip(row + steps).FirstOrDefault();
261
rowDefitions.Add(selItem);
263
before.AddBeforeSelf(selItem);
265
var controls = gridTree.Elements().Where(element => IsSameRow(element, row)).ToList();
267
var controlsUp = gridTree.Elements()
270
var rowAttrib = element2.Attribute(gridRowName) ?? new XAttribute(gridRowName, 0);
271
int rowAttribValue = 0;
272
if (int.TryParse(rowAttrib.Value, out rowAttribValue))
273
return rowAttribValue > row && rowAttribValue <= (row + steps);
279
controls.ForEach(item => MoveRowItem(item, steps));
280
controlsUp.ForEach(item2 => MoveRowItem(item2, -1));
285
void DeleteRow(StackPanel block)
287
int row = (int)block.GetValue(Grid.RowProperty);
288
UpdateUndoRedoState();
290
var items = rowDefitions.Elements().Skip(row);
291
var selItem = items.FirstOrDefault();
295
var controls = gridTree.Elements()
298
var rowAttrib = element.Attribute(gridRowName) ?? new XAttribute(gridRowName, 0);
299
int rowAttribValue = 0;
300
if (int.TryParse(rowAttrib.Value, out rowAttribValue))
301
return rowAttribValue >= row;
307
controls.ForEach(item => MoveRowItem(item, -1));
312
void InsertBefore(StackPanel block)
314
int column = (int)block.GetValue(Grid.ColumnProperty);
315
UpdateUndoRedoState();
317
var newColumn = new XElement(colDefName);
318
newColumn.SetAttributeValue(XName.Get("Width"), "*");
319
var items = colDefitions.Elements().Skip(column);
320
var selItem = items.FirstOrDefault();
322
selItem.AddBeforeSelf(newColumn);
324
colDefitions.Add(newColumn);
326
var controls = gridTree.Elements()
329
var colAttrib = element.Attribute(gridColName) ?? new XAttribute(gridColName, 0);
330
int colAttribValue = 0;
331
if (int.TryParse(colAttrib.Value, out colAttribValue))
332
return colAttribValue >= column;
338
controls.ForEach(item => MoveColumnItem(item, 1));
343
void InsertAfter(StackPanel block)
345
int column = (int)block.GetValue(Grid.ColumnProperty);
346
UpdateUndoRedoState();
348
var newColumn = new XElement(colDefName);
349
newColumn.SetAttributeValue(XName.Get("Width"), "*");
350
var items = colDefitions.Elements().Skip(column);
351
var selItem = items.FirstOrDefault();
353
selItem.AddAfterSelf(newColumn);
355
colDefitions.Add(newColumn);
357
var controls = gridTree
361
var colAttrib = element.Attribute(gridColName) ?? new XAttribute(gridColName, 0);
362
int colAttribValue = 0;
363
if (int.TryParse(colAttrib.Value, out colAttribValue))
364
return colAttribValue > column;
370
controls.ForEach(item => MoveColumnItem(item, 1));
375
void MoveLeft(int column, int steps)
377
if (steps < 1 || column - steps < 0)
380
UpdateUndoRedoState();
382
var selItem = colDefitions.Elements().Skip(column).FirstOrDefault();
386
var before = colDefitions.Elements().Skip(column - steps).FirstOrDefault();
389
before.AddBeforeSelf(selItem);
391
var controls = gridTree.Elements().Where(element => IsSameColumn(element, column)).ToList();
393
var controlsLeft = gridTree
397
var colAttrib = element2.Attribute(gridColName) ?? new XAttribute(gridColName, 0);
398
int colAttribValue = 0;
399
if (int.TryParse(colAttrib.Value, out colAttribValue))
400
return colAttribValue < column && colAttribValue >= (column - steps);
406
controls.ForEach(item => MoveColumnItem(item, -steps));
407
controlsLeft.ForEach(item => MoveColumnItem(item, 1));
413
bool IsSameColumn(XElement element, int column)
415
var colAttrib = element.Attribute(gridColName) ?? new XAttribute(gridColName, 0);
416
int colAttribValue = 0;
417
if (int.TryParse(colAttrib.Value, out colAttribValue))
418
return colAttribValue == column;
423
void MoveColumnItem(XElement item, int steps)
425
var colAttrib = item.Attribute(gridColName) ?? new XAttribute(gridColName, 0);
426
item.SetAttributeValue(gridColName, int.Parse(colAttrib.Value, CultureInfo.InvariantCulture) + steps);
429
void MoveRowItem(XElement item, int steps)
431
var rowAttrib = item.Attribute(gridRowName) ?? new XAttribute(gridRowName, 0);
432
item.SetAttributeValue(gridRowName, int.Parse(rowAttrib.Value, CultureInfo.InvariantCulture) + steps);
435
void MoveRight(int column, int steps)
437
if (steps < 1 || column + steps > colDefitions.Elements().Count())
440
UpdateUndoRedoState();
442
var selItem = colDefitions.Elements().Skip(column).FirstOrDefault();
446
var before = colDefitions.Elements().Skip(column + steps).FirstOrDefault();
448
colDefitions.Add(selItem);
450
before.AddBeforeSelf(selItem);
452
var controls = gridTree.Elements().Where(element => IsSameColumn(element, column)).ToList();
454
var controlsRight = gridTree
458
var colAttrib = element2.Attribute(gridColName) ?? new XAttribute(gridColName, 0);
459
int colAttribValue = 0;
460
if (int.TryParse(colAttrib.Value, out colAttribValue))
461
return colAttribValue > column && colAttribValue <= (column + steps);
467
controls.ForEach(item => MoveColumnItem(item, steps));
468
controlsRight.ForEach(item2 => MoveColumnItem(item2, -1));
473
void DeleteColumn(StackPanel block)
475
int column = (int)block.GetValue(Grid.ColumnProperty);
476
UpdateUndoRedoState();
478
var items = colDefitions.Elements().Skip(column);
479
var selItem = items.FirstOrDefault();
483
var controls = gridTree
487
var colAttrib = element.Attribute(gridColName) ?? new XAttribute(gridColName, 0);
488
int colAttribValue = 0;
489
if (int.TryParse(colAttrib.Value, out colAttribValue))
490
return colAttribValue >= column;
496
controls.ForEach(item => MoveColumnItem(item, -1));
502
void BtnCancelClick(object sender, RoutedEventArgs e)
504
this.DialogResult = false;
507
void BtnOKClick(object sender, RoutedEventArgs e)
509
if (gridLengthInvalid) {
510
MessageService.ShowError("Grid is invalid, please check the row heights and column widths!");
514
this.DialogResult = true;
519
if (this.marker != null) {
520
AdornerLayer.GetAdornerLayer(this.buttonPanel).Remove(this.marker);
521
AdornerLayer.GetAdornerLayer(this.dropPanel).Remove(this.marker);
525
this.gridDisplay.Children.Clear();
526
this.gridDisplay.RowDefinitions.Clear();
527
this.gridDisplay.ColumnDefinitions.Clear();
530
this.columnWidthGrid.ColumnDefinitions.Clear();
531
this.columnWidthGrid.Children.Clear();
533
this.rowHeightGrid.RowDefinitions.Clear();
534
this.rowHeightGrid.Children.Clear();
536
int rows = rowDefitions.Elements().Count();
537
int cols = colDefitions.Elements().Count();
540
rowDefitions.Add(new XElement(rowDefName).AddAttribute("Height", "*"));
544
colDefitions.Add(new XElement(colDefName).AddAttribute("Width", "*"));
548
for (int i = 0; i < cols; i++) {
549
this.gridDisplay.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });
550
this.columnWidthGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) });
551
GridLengthEditor editor = new GridLengthEditor(Orientation.Horizontal, i, (colDefitions.Elements().ElementAt(i).Attribute("Width") ?? new XAttribute("Width", "")).Value);
553
editor.SelectedValueChanged += new EventHandler<GridLengthSelectionChangedEventArgs>(EditorSelectedValueChanged);
554
editor.Deleted += new EventHandler<GridLengthSelectionChangedEventArgs>(EditorDeleted);
555
editor.MouseLeftButtonDown += new MouseButtonEventHandler(EditorMouseLeftButtonDown);
556
editor.Drop += new DragEventHandler(EditorDrop);
557
editor.DragOver += new DragEventHandler(EditorDragOver);
559
editor.AllowDrop = true;
561
this.columnWidthGrid.Children.Add(editor);
563
Button leftAddButton = new Button() {
565
HorizontalAlignment = HorizontalAlignment.Left,
566
Margin = new Thickness(-10, 10, 5,10),
567
Padding = new Thickness(3),
571
leftAddButton.Click += BtnAddColumnClick;
573
leftAddButton.SetValue(Grid.ColumnProperty, i);
574
this.columnWidthGrid.Children.Add(leftAddButton);
577
Button rightAddButton = new Button() {
579
HorizontalAlignment = HorizontalAlignment.Right,
580
Margin = new Thickness(5, 10, 0, 10),
581
Padding = new Thickness(3)
584
rightAddButton.Click += BtnAddColumnClick;
586
rightAddButton.SetValue(Grid.ColumnProperty, i);
587
this.columnWidthGrid.Children.Add(rightAddButton);
591
for (int i = 0; i < rows; i++) {
592
this.gridDisplay.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
594
this.rowHeightGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star) });
595
GridLengthEditor editor = new GridLengthEditor(Orientation.Vertical, i, (rowDefitions.Elements().ElementAt(i).Attribute("Height") ?? new XAttribute("Height", "")).Value);
597
editor.SelectedValueChanged += new EventHandler<GridLengthSelectionChangedEventArgs>(EditorSelectedValueChanged);
598
editor.Deleted += new EventHandler<GridLengthSelectionChangedEventArgs>(EditorDeleted);
599
editor.MouseLeftButtonDown += new MouseButtonEventHandler(EditorMouseLeftButtonDown);
600
editor.Drop += new DragEventHandler(EditorDrop);
601
editor.DragOver += new DragEventHandler(EditorDragOver);
603
editor.AllowDrop = true;
605
this.rowHeightGrid.Children.Add(editor);
607
Button topAddButton = new Button() {
609
VerticalAlignment = VerticalAlignment.Top,
610
Margin = new Thickness(10, -10, 10, 5),
611
Padding = new Thickness(3),
615
topAddButton.Click += BtnAddRowClick;
617
topAddButton.SetValue(Grid.RowProperty, i);
618
this.rowHeightGrid.Children.Add(topAddButton);
621
Button bottomAddButton = new Button() {
623
VerticalAlignment = VerticalAlignment.Bottom,
624
Margin = new Thickness(10, 5, 10, 0),
625
Padding = new Thickness(3)
628
bottomAddButton.Click += BtnAddRowClick;
630
bottomAddButton.SetValue(Grid.RowProperty, i);
631
this.rowHeightGrid.Children.Add(bottomAddButton);
634
for (int j = 0; j < cols; j++) {
635
StackPanel displayRect = new StackPanel() {
636
Margin = new Thickness(5),
637
Background = Brushes.LightGray,
638
Orientation = Orientation.Vertical
641
displayRect.AllowDrop = true;
643
displayRect.Drop += new DragEventHandler(DisplayRectDrop);
644
displayRect.DragOver += new DragEventHandler(DisplayRectDragOver);
646
displayRect.Children.AddRange(BuildItemsForCell(i, j));
648
displayRect.SetValue(Grid.RowProperty, i);
649
displayRect.SetValue(Grid.ColumnProperty, j);
651
displayRect.ContextMenuOpening += new ContextMenuEventHandler(DisplayRectContextMenuOpening);
653
this.gridDisplay.Children.Add(displayRect);
657
this.InvalidateVisual();
660
void EditorDragOver(object sender, DragEventArgs e)
663
GridLengthEditor target = sender as GridLengthEditor;
664
GridLengthEditor source = e.Data.GetData(typeof(GridLengthEditor)) as GridLengthEditor;
667
if (marker != null) {
668
AdornerLayer.GetAdornerLayer(marker.AdornedElement).Remove(marker);
672
if (target != null && source != null && source.Orientation == target.Orientation
673
&& (target != source && (target.Cell < source.Cell || target.Cell > source.Cell + 1))) {
674
marker = DragDropMarkerAdorner.CreateAdornerCellMove(target);
675
e.Effects = DragDropEffects.Move;
679
e.Effects = DragDropEffects.None;
680
} catch (Exception ex) {
681
Core.LoggingService.Error(ex);
685
void EditorDrop(object sender, DragEventArgs e)
688
GridLengthEditor source = e.Data.GetData(typeof(GridLengthEditor)) as GridLengthEditor;
689
GridLengthEditor target = sender as GridLengthEditor;
691
if (source != null && target != null) {
692
if (source.Orientation == Orientation.Horizontal) {
693
if (source.Cell > target.Cell)
694
MoveLeft(source.Cell, Math.Abs(source.Cell - target.Cell));
696
MoveRight(source.Cell, Math.Abs(source.Cell - target.Cell) - 1);
699
if (source.Orientation == Orientation.Vertical) {
700
if (source.Cell > target.Cell)
701
MoveUp(source.Cell, Math.Abs(source.Cell - target.Cell));
703
MoveDown(source.Cell, Math.Abs(source.Cell - target.Cell) - 1);
706
} catch (Exception ex) {
707
Core.LoggingService.Error(ex);
711
void EditorMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
713
DragDropEffects allowedEffects = DragDropEffects.Move;
714
GridLengthEditor editor = sender as GridLengthEditor;
715
DragDrop.DoDragDrop(editor, editor, allowedEffects);
718
void EditorDeleted(object sender, GridLengthSelectionChangedEventArgs e)
720
if (e.Type == Orientation.Horizontal)
721
DeleteColumn(gridDisplay.Children.OfType<StackPanel>().First(item => (int)item.GetValue(Grid.ColumnProperty) == e.Cell));
723
DeleteRow(gridDisplay.Children.OfType<StackPanel>().First(item => (int)item.GetValue(Grid.RowProperty) == e.Cell));
726
void EditorSelectedValueChanged(object sender, GridLengthSelectionChangedEventArgs e)
728
UpdateUndoRedoState();
730
string value = "Invalid";
735
if (e.Type == Orientation.Horizontal)
736
colDefitions.Elements().ElementAt(e.Cell).SetAttributeValue("Width", value);
738
rowDefitions.Elements().ElementAt(e.Cell).SetAttributeValue("Height", value);
740
gridLengthInvalid = colDefitions.Elements().Any(col => (col.Attribute("Width") ?? new XAttribute("Width", "*")).Value == "Invalid")
741
|| rowDefitions.Elements().Any(row => (row.Attribute("Height") ?? new XAttribute("Height", "*")).Value == "Invalid");
744
DragDropMarkerAdorner marker = null;
746
void DisplayRectDragOver(object sender, DragEventArgs e)
749
StackPanel target = sender as StackPanel;
752
if (marker != null) {
753
AdornerLayer.GetAdornerLayer(marker.AdornedElement).Remove(marker);
757
if (target != null) {
758
FrameworkElement element = target.InputHitTest(e.GetPosition(target)) as FrameworkElement;
759
if (e.Data.GetData(typeof(XElement)) != null && (element is StackPanel || element.TemplatedParent is Label)) {
760
marker = DragDropMarkerAdorner.CreateAdornerContentMove(target, element);
761
e.Effects = DragDropEffects.Move;
766
e.Effects = DragDropEffects.None;
767
} catch (Exception ex) {
768
Core.LoggingService.Error(ex);
772
void DisplayRectDrop(object sender, DragEventArgs e)
775
if (e.Data.GetData(typeof(XElement)) != null) {
776
XElement data = e.Data.GetData(typeof(XElement)) as XElement;
778
UpdateUndoRedoState();
780
StackPanel target = sender as StackPanel;
781
int x = (int)target.GetValue(Grid.ColumnProperty);
782
int y = (int)target.GetValue(Grid.RowProperty);
784
data.SetAttributeValue(gridColName, x);
785
data.SetAttributeValue(gridRowName, y);
787
Point p = e.GetPosition(target);
788
TextBlock block = target.InputHitTest(p) as TextBlock;
791
XElement element = block.Tag as XElement;
792
data.MoveBefore(element);
794
XElement parent = gridTree;
795
XElement element = parent.Elements().LastOrDefault();
796
if (data.Parent != null)
801
if (element.Parent == null)
804
element.AddAfterSelf(data);
810
} catch (Exception ex) {
811
Core.LoggingService.Error(ex);
815
IEnumerable<UIElement> BuildItemsForCell(int row, int column)
817
var controls = gridTree
821
var rowAttrib = element.Attribute(gridRowName) ?? new XAttribute(gridRowName, 0);
822
var colAttrib = element.Attribute(gridColName) ?? new XAttribute(gridColName, 0);
823
return row.ToString() == rowAttrib.Value && column.ToString() == colAttrib.Value;
827
foreach (var control in controls) {
828
var nameAttrib = control.Attribute(XName.Get("Name", CompletionDataHelper.XamlNamespace)) ?? control.Attribute(XName.Get("Name"));
829
StringBuilder builder = new StringBuilder(control.Name.LocalName);
830
if (nameAttrib != null)
831
builder.Append(" (" + nameAttrib.Value + ")");
833
Label label = new Label() {
834
Content = builder.ToString(),
835
Template = this.Resources["itemTemplate"] as ControlTemplate,
840
label.MouseLeftButtonDown += new MouseButtonEventHandler(LabelMouseLeftButtonDown);
842
Debug.Assert(label.Tag != null);
848
void LabelMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
850
DragDropEffects allowedEffects = DragDropEffects.Move;
851
Label label = sender as Label;
852
DragDrop.DoDragDrop(label, label.Tag, allowedEffects);
855
void UpdateUndoRedoState()
857
this.undoStack.Push(UndoStep.CreateStep(gridTree, rowDefitions, colDefitions, additionalProperties));
858
this.redoStack.Clear();
861
public XElement ConstructedTree
864
gridTree.AddFirst(additionalProperties);
865
gridTree.AddFirst(colDefitions);
866
gridTree.AddFirst(rowDefitions);
872
void DisplayRectContextMenuOpening(object sender, ContextMenuEventArgs e)
874
MenuItem undoItem = new MenuItem();
875
undoItem.Header = "Undo";
876
undoItem.IsEnabled = undoStack.Count > 0;
877
undoItem.Click += new RoutedEventHandler(UndoItemClick);
879
MenuItem redoItem = new MenuItem();
880
redoItem.Header = "Redo";
881
redoItem.IsEnabled = redoStack.Count > 0;
882
redoItem.Click += new RoutedEventHandler(RedoItemClick);
884
StackPanel block = sender as StackPanel;
886
ContextMenu menu = new ContextMenu() {
894
CreateItem("Insert above", InsertAbove, block),
895
CreateItem("Insert below", InsertBelow, block),
897
CreateItem("Move up", MoveUp, (int)block.GetValue(Grid.RowProperty)),
898
CreateItem("Move down", MoveDown, (int)block.GetValue(Grid.RowProperty)),
900
CreateItem("Delete", DeleteRow, block)
906
CreateItem("Insert before", InsertBefore, block),
907
CreateItem("Insert after", InsertAfter, block),
909
CreateItem("Move left", MoveLeft, (int)block.GetValue(Grid.ColumnProperty)),
910
CreateItem("Move right", MoveRight, (int)block.GetValue(Grid.ColumnProperty)),
912
CreateItem("Delete", DeleteColumn, block)
921
void RedoItemClick(object sender, RoutedEventArgs e)
923
if (redoStack.Count > 0)
924
HandleSteps(redoStack, undoStack);
927
void UndoItemClick(object sender, RoutedEventArgs e)
929
if (undoStack.Count > 0)
930
HandleSteps(undoStack, redoStack);
933
void HandleSteps(Stack<UndoStep> stack1, Stack<UndoStep> stack2)
935
UndoStep step = stack1.Pop();
937
stack2.Push(UndoStep.CreateStep(gridTree, rowDefitions, colDefitions, additionalProperties));
939
this.additionalProperties = step.AdditionalProperties;
940
this.rowDefitions = step.RowDefinitions;
941
this.colDefitions = step.ColumnDefinitions;
942
this.gridTree = step.Tree;
947
void BtnDeleteItemClick(object sender, RoutedEventArgs e)
949
Button source = e.OriginalSource as Button;
950
XElement item = source.Tag as XElement;
952
UpdateUndoRedoState();
959
void BtnAddRowClick(object sender, RoutedEventArgs e)
961
Button b = sender as Button;
963
InsertBelow(gridDisplay.Children.OfType<StackPanel>()
964
.First(item => (int)item.GetValue(Grid.RowProperty) == rowDefitions.Elements().Count() - 1));
966
InsertAbove(gridDisplay.Children.OfType<StackPanel>()
967
.First(item => (int)item.GetValue(Grid.RowProperty) == (int)b.Tag));
971
void BtnAddColumnClick(object sender, RoutedEventArgs e)
973
Button b = sender as Button;
975
InsertAfter(gridDisplay.Children.OfType<StackPanel>()
976
.First(item => (int)item.GetValue(Grid.ColumnProperty) == colDefitions.Elements().Count() - 1));
978
InsertBefore(gridDisplay.Children.OfType<StackPanel>()
979
.First(item => (int)item.GetValue(Grid.ColumnProperty) == (int)b.Tag));
983
void ButtonPanelDrop(object sender, DragEventArgs e)
986
GridLengthEditor source = e.Data.GetData(typeof(GridLengthEditor)) as GridLengthEditor;
989
MoveDown(source.Cell, Math.Abs(source.Cell - rowDefitions.Elements().Count()) - 1);
990
} catch (Exception ex) {
991
Core.LoggingService.Error(ex);
995
void DropPanelDrop(object sender, DragEventArgs e)
998
GridLengthEditor source = e.Data.GetData(typeof(GridLengthEditor)) as GridLengthEditor;
1001
MoveRight(source.Cell, Math.Abs(source.Cell - colDefitions.Elements().Count()) - 1);
1002
} catch (Exception ex) {
1003
Core.LoggingService.Error(ex);
1007
void DropPanelDragOver(object sender, DragEventArgs e)
1010
StackPanel target = sender as StackPanel;
1011
GridLengthEditor source = e.Data.GetData(typeof(GridLengthEditor)) as GridLengthEditor;
1014
if (marker != null) {
1015
AdornerLayer.GetAdornerLayer(marker.AdornedElement).Remove(marker);
1019
if (target != null && source != null && source.Orientation == Orientation.Horizontal && source.Cell + 1 < colDefitions.Elements().Count()) {
1020
marker = DragDropMarkerAdorner.CreateAdornerCellMove(target);
1021
e.Effects = DragDropEffects.Move;
1025
e.Effects = DragDropEffects.None;
1026
} catch (Exception ex) {
1027
Core.LoggingService.Error(ex);
1031
void ButtonPanelDragOver(object sender, DragEventArgs e)
1034
StackPanel target = sender as StackPanel;
1035
GridLengthEditor source = e.Data.GetData(typeof(GridLengthEditor)) as GridLengthEditor;
1038
if (marker != null) {
1039
AdornerLayer.GetAdornerLayer(marker.AdornedElement).Remove(marker);
1043
if (target != null && source != null && source.Orientation == Orientation.Vertical && source.Cell + 1 < rowDefitions.Elements().Count()) {
1044
marker = DragDropMarkerAdorner.CreateAdornerCellMove(target);
1045
e.Effects = DragDropEffects.Move;
1049
e.Effects = DragDropEffects.None;
1050
} catch (Exception ex) {
1051
Core.LoggingService.Error(ex);