Skip to content

Commit

Permalink
Merge pull request #1784 from cwensley/curtis/wpf-customcell-treegrid…
Browse files Browse the repository at this point in the history
…view

Wpf: Fix crash with TreeGridView for editable cells
  • Loading branch information
cwensley authored Sep 16, 2020
2 parents 3eccf02 + 21ef66f commit c1f075f
Show file tree
Hide file tree
Showing 13 changed files with 57 additions and 41 deletions.
22 changes: 13 additions & 9 deletions src/Eto.Wpf/CustomControls/TreeGridView/TreeToggleButton.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class TreeTogglePanel : DockPanel
{
public const int LevelWidth = 16;
readonly TreeToggleButton button;
readonly FrameworkElement content;
FrameworkElement _content;

public TreeTogglePanel(FrameworkElement content, TreeController controller)
{
Expand All @@ -24,11 +24,21 @@ public TreeTogglePanel(FrameworkElement content, TreeController controller)
SetDock(button, Dock.Left);
Children.Add(button);
Children.Add(content);
this.content = content;
_content = content;

DataContextChanged += OnDataContextChanged;
}

public void SetContent(FrameworkElement content)
{
if (ReferenceEquals(content, _content))
return;

Children.Remove(_content);
Children.Add(content);
_content = content;
}

private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
if (DataContext is ITreeGridItem item)
Expand Down Expand Up @@ -65,7 +75,7 @@ public static bool IsOverExpander(DependencyObject hitTestResult)

while (hitTestResult != null && !ReferenceEquals(hitTestResult, panel))
{
if (ReferenceEquals(hitTestResult, panel.content))
if (ReferenceEquals(hitTestResult, panel._content))
return true;
hitTestResult = hitTestResult.GetVisualParent<DependencyObject>();
}
Expand All @@ -84,12 +94,6 @@ static TreeToggleButton ()
DefaultStyleKeyProperty.OverrideMetadata (typeof (TreeToggleButton), new FrameworkPropertyMetadata (typeof (TreeToggleButton)));
}

public static FrameworkElement Create (FrameworkElement content, TreeController controller)
{
return new TreeTogglePanel(content, controller);
}


protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e)
{
base.OnPreviewMouseLeftButtonUp(e);
Expand Down
6 changes: 3 additions & 3 deletions src/Eto.Wpf/Forms/Cells/CellHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace Eto.Wpf.Forms.Cells
public interface ICellContainerHandler
{
Grid Grid { get; }
sw.FrameworkElement SetupCell(ICellHandler cell, sw.FrameworkElement defaultContent);
sw.FrameworkElement SetupCell(ICellHandler handler, sw.FrameworkElement defaultContent, swc.DataGridCell cell);
void FormatCell(ICellHandler cell, sw.FrameworkElement element, swc.DataGridCell datacell, object dataItem);
void CellEdited(ICellHandler cell, sw.FrameworkElement element);
}
Expand Down Expand Up @@ -44,9 +44,9 @@ public void FormatCell(sw.FrameworkElement element, swc.DataGridCell cell, objec
ContainerHandler.FormatCell(this, element, cell, dataItem);
}

public sw.FrameworkElement SetupCell(sw.FrameworkElement defaultContent)
public sw.FrameworkElement SetupCell(sw.FrameworkElement defaultContent, swc.DataGridCell cell)
{
return ContainerHandler != null ? ContainerHandler.SetupCell(this, defaultContent) : defaultContent;
return ContainerHandler != null ? ContainerHandler.SetupCell(this, defaultContent, cell) : defaultContent;
}

protected static T GetControl<T>(swc.DataGridCell cell)
Expand Down
4 changes: 2 additions & 2 deletions src/Eto.Wpf/Forms/Cells/CheckBoxCellHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ protected override sw.FrameworkElement GenerateElement(swc.DataGridCell cell, ob
{
var element = (swc.CheckBox)base.GenerateElement(cell, dataItem);
InitializeElement(element, cell, dataItem);
return Handler.SetupCell(element);
return Handler.SetupCell(element, cell);
}

void InitializeElement(swc.CheckBox element, swc.DataGridCell cell, object dataItem)
Expand Down Expand Up @@ -80,7 +80,7 @@ protected override sw.FrameworkElement GenerateEditingElement(swc.DataGridCell c
{
var element = (swc.CheckBox)base.GenerateEditingElement(cell, dataItem);
InitializeElement(element, cell, dataItem);
return Handler.SetupCell(element);
return Handler.SetupCell(element, cell);
}
protected override bool CommitCellEdit(sw.FrameworkElement editingElement)
{
Expand Down
4 changes: 2 additions & 2 deletions src/Eto.Wpf/Forms/Cells/ComboBoxCellHandler.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ protected override sw.FrameworkElement GenerateElement(swc.DataGridCell cell, ob
{
var element = (swc.ComboBox)base.GenerateElement(cell, dataItem);
Initialize(cell, element, dataItem);
return Handler.SetupCell(element);
return Handler.SetupCell(element, cell);
}

void Initialize(swc.DataGridCell cell, swc.ComboBox control, object dataItem)
Expand Down Expand Up @@ -72,7 +72,7 @@ protected override sw.FrameworkElement GenerateEditingElement(swc.DataGridCell c
};
SetControlEditInitialized(element, true);
}
return Handler.SetupCell(element);
return Handler.SetupCell(element, cell);
}

protected override bool CommitCellEdit(sw.FrameworkElement editingElement)
Expand Down
11 changes: 6 additions & 5 deletions src/Eto.Wpf/Forms/Cells/CustomCellHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ static void HandlePreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var ctl = sender as sw.FrameworkElement;
var cell = ctl?.GetVisualParent<swc.DataGridCell>();
if (!cell.IsKeyboardFocusWithin)
if (!cell.IsKeyboardFocusWithin && !cell.Column.IsReadOnly)
{
cell.IsEditing = true;
//var row = cell.GetVisualParent<swc.DataGridRow>();
Expand Down Expand Up @@ -302,12 +302,13 @@ static void HandleCellSelectedChanged(object sender, sw.RoutedEventArgs e)

protected override sw.FrameworkElement GenerateElement(swc.DataGridCell cell, object dataItem)
{
return Handler.SetupCell(Create(cell));
return Handler.SetupCell(Create(cell), cell);
}

protected override sw.FrameworkElement GenerateEditingElement(swc.DataGridCell cell, object dataItem)
{
return Handler.SetupCell(Create(cell));

return Handler.SetupCell(Create(cell), cell);
}

protected override object PrepareCellForEdit(sw.FrameworkElement editingElement, sw.RoutedEventArgs editingEventArgs)
Expand All @@ -334,10 +335,10 @@ static WpfCellEventArgs GetEditArgs(CustomCellHandler handler, swc.DataGridCell
{
if (handler == null)
return null;
var wpfctl = editingElement as EtoBorder;
var wpfctl = editingElement as EtoBorder ?? GetControl<EtoBorder>(cell);
var etoctl = wpfctl?.Control;
var args = etoctl?.Properties.Get<WpfCellEventArgs>(CellEventArgs_Key);
if (args == null)
if (args == null && wpfctl != null)
{
args = new WpfCellEventArgs(handler.ContainerHandler?.Grid, handler.Widget, -1, cell.Column, wpfctl.IsLoaded ? wpfctl.DataContext : null, CellStates.None, etoctl);
etoctl?.Properties.Set(CellEventArgs_Key, args);
Expand Down
4 changes: 2 additions & 2 deletions src/Eto.Wpf/Forms/Cells/DrawableCellHandler.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,12 @@ EtoCanvas Create(swc.DataGridCell cell)

protected override sw.FrameworkElement GenerateElement(swc.DataGridCell cell, object dataItem)
{
return Handler.SetupCell(Create(cell));
return Handler.SetupCell(Create(cell), cell);
}

protected override sw.FrameworkElement GenerateEditingElement(swc.DataGridCell cell, object dataItem)
{
return Handler.SetupCell(Create(cell));
return Handler.SetupCell(Create(cell), cell);
}
}

Expand Down
8 changes: 4 additions & 4 deletions src/Eto.Wpf/Forms/Cells/ImageTextCellHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,13 +122,13 @@ swc.Image CreateImage()
return image;
}

sw.FrameworkElement SetupCell(sw.FrameworkElement element)
sw.FrameworkElement SetupCell(sw.FrameworkElement element, swc.DataGridCell cell)
{
element.HorizontalAlignment = sw.HorizontalAlignment.Stretch;
var container = new swc.DockPanel();
container.Children.Add(CreateImage());
container.Children.Add(element);
return Handler.SetupCell(container);
return Handler.SetupCell(container, cell);
}

swd.Binding CreateBinding(string property)
Expand All @@ -154,7 +154,7 @@ protected override sw.FrameworkElement GenerateElement(swc.DataGridCell cell, ob
control.Text = Handler.GetTextValue(control.DataContext);
Handler.FormatCell(control, cell, control.DataContext);
};
return SetupCell(element);
return SetupCell(element, cell);
}

protected override object PrepareCellForEdit(sw.FrameworkElement editingElement, sw.RoutedEventArgs editingEventArgs)
Expand Down Expand Up @@ -203,7 +203,7 @@ protected override sw.FrameworkElement GenerateEditingElement(swc.DataGridCell c
control.Text = Handler.GetTextValue(control.DataContext);
Handler.FormatCell(control, cell, control.DataContext);
};
return SetupCell(element);
return SetupCell(element, cell);
}


Expand Down
4 changes: 2 additions & 2 deletions src/Eto.Wpf/Forms/Cells/ImageViewCellHandler.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ swc.Image Image (swc.DataGridCell cell)

protected override sw.FrameworkElement GenerateElement (swc.DataGridCell cell, object dataItem)
{
return Handler.SetupCell (Image(cell));
return Handler.SetupCell (Image(cell), cell);
}

protected override object PrepareCellForEdit (sw.FrameworkElement editingElement, sw.RoutedEventArgs editingEventArgs)
Expand All @@ -70,7 +70,7 @@ protected override object PrepareCellForEdit (sw.FrameworkElement editingElement

protected override sw.FrameworkElement GenerateEditingElement (swc.DataGridCell cell, object dataItem)
{
return Handler.SetupCell (Image (cell));
return Handler.SetupCell (Image (cell), cell);
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/Eto.Wpf/Forms/Cells/ProgressCellHandler.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,13 @@ static DataGridProgressBarColumn()
protected override sw.FrameworkElement GenerateElement(swc.DataGridCell cell, object dataItem)
{
var element = GenerateProgressBar(cell, dataItem);
return Handler.SetupCell(element);
return Handler.SetupCell(element, cell);
}

protected override sw.FrameworkElement GenerateEditingElement(swc.DataGridCell cell, object dataItem)
{
return GenerateProgressBar(cell, dataItem);
var element = GenerateProgressBar(cell, dataItem);
return Handler.SetupCell(element, cell);
}

private swc.Grid GenerateProgressBar(swc.DataGridCell cell, object dataItem)
Expand Down
4 changes: 2 additions & 2 deletions src/Eto.Wpf/Forms/Cells/TextBoxCellHandler.cs
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ protected override sw.FrameworkElement GenerateElement(swc.DataGridCell cell, ob
control.Text = Handler.GetValue(control.DataContext);
Handler.FormatCell(control, cell, control.DataContext);
};
return Handler.SetupCell(element);
return Handler.SetupCell(element, cell);
}

protected override sw.FrameworkElement GenerateEditingElement(swc.DataGridCell cell, object dataItem)
Expand All @@ -130,7 +130,7 @@ protected override sw.FrameworkElement GenerateEditingElement(swc.DataGridCell c
control.Text = Handler.GetValue(control.DataContext);
Handler.FormatCell(control, cell, control.DataContext);
};
return Handler.SetupCell(element);
return Handler.SetupCell(element, cell);
}

protected override object PrepareCellForEdit(sw.FrameworkElement editingElement, sw.RoutedEventArgs editingEventArgs)
Expand Down
6 changes: 3 additions & 3 deletions src/Eto.Wpf/Forms/Controls/GridColumnHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public interface IGridHandler
Grid Widget { get; }
bool Loaded { get; }
bool DisableAutoScrollToSelection { get; }
sw.FrameworkElement SetupCell (IGridColumnHandler column, sw.FrameworkElement defaultContent);
sw.FrameworkElement SetupCell (IGridColumnHandler column, sw.FrameworkElement defaultContent, swc.DataGridCell cell);
void FormatCell (IGridColumnHandler column, ICellHandler cell, sw.FrameworkElement element, swc.DataGridCell gridcell, object dataItem);
void CellEdited(int row, swc.DataGridColumn dataGridColumn, object dataItem);
}
Expand Down Expand Up @@ -119,9 +119,9 @@ public void Setup (IGridHandler gridHandler)
GridHandler = gridHandler;
}

public sw.FrameworkElement SetupCell (ICellHandler cell, sw.FrameworkElement defaultContent)
public sw.FrameworkElement SetupCell (ICellHandler handler, sw.FrameworkElement defaultContent, swc.DataGridCell cell)
{
return GridHandler != null ? GridHandler.SetupCell(this, defaultContent) : defaultContent;
return GridHandler != null ? GridHandler.SetupCell(this, defaultContent, cell) : defaultContent;
}

public void FormatCell (ICellHandler cell, sw.FrameworkElement element, swc.DataGridCell gridcell, object dataItem)
Expand Down
2 changes: 1 addition & 1 deletion src/Eto.Wpf/Forms/Controls/GridHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -609,7 +609,7 @@ public void BeginEdit(int row, int column)

public bool CancelEdit() => Control.CancelEdit();

public virtual sw.FrameworkElement SetupCell(IGridColumnHandler column, sw.FrameworkElement defaultContent)
public virtual sw.FrameworkElement SetupCell(IGridColumnHandler column, sw.FrameworkElement defaultContent, swc.DataGridCell cell)
{
return defaultContent;
}
Expand Down
18 changes: 14 additions & 4 deletions src/Eto.Wpf/Forms/Controls/TreeGridViewHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -183,11 +183,21 @@ public ITreeGridItem SelectedItem

public IEnumerable<object> SelectedItems => Control.SelectedItems.OfType<object>();

public override sw.FrameworkElement SetupCell(IGridColumnHandler column, sw.FrameworkElement defaultContent)
public override sw.FrameworkElement SetupCell(IGridColumnHandler column, sw.FrameworkElement defaultContent, swc.DataGridCell cell)
{
if (object.ReferenceEquals(column, Columns.Collection[0].Handler))
return TreeToggleButton.Create(defaultContent, controller);
return defaultContent;
// only first column
if (!ReferenceEquals(column, Columns.Collection[0].Handler))
return defaultContent;

// already a toggle panel, reuse it and set new content (if needed)
if (cell.Content is TreeTogglePanel ttp)
{
ttp.SetContent(defaultContent);
return ttp;
}

// create a new toggle panel
return new TreeTogglePanel(defaultContent, controller);
}

void ITreeHandler.PreResetTree()
Expand Down

0 comments on commit c1f075f

Please sign in to comment.