Added context menu for show/hide columns in TableEditorScenario

This commit is contained in:
tznind
2022-12-03 19:49:42 +00:00
parent cf4c02a71f
commit 6136656327

View File

@@ -70,6 +70,7 @@ namespace UICatalog.Scenarios {
miAlternatingColors = new MenuItem ("Alternating Colors", "", () => ToggleAlternatingColors()){CheckType = MenuItemCheckStyle.Checked},
miCursor = new MenuItem ("Invert Selected Cell First Character", "", () => ToggleInvertSelectedCellFirstCharacter()){Checked = tableView.Style.InvertSelectedCellFirstCharacter,CheckType = MenuItemCheckStyle.Checked},
new MenuItem ("_ClearColumnStyles", "", () => ClearColumnStyles()),
new MenuItem ("Sho_w All Columns", "", ()=>ShowAllColumns())
}),
new MenuBarItem ("_Column", new MenuItem [] {
new MenuItem ("_Set Max Width", "", SetMaxWidth),
@@ -137,45 +138,80 @@ namespace UICatalog.Scenarios {
tableView.ScreenToCell (e.MouseEvent.X, e.MouseEvent.Y, out DataColumn clickedCol);
if (clickedCol != null) {
if (e.MouseEvent.Flags.HasFlag (MouseFlags.Button1Clicked)) {
// left click in a header
SortColumn (clickedCol);
} else if (e.MouseEvent.Flags.HasFlag (MouseFlags.Button3Clicked)) {
// work out new sort order
var sort = tableView.Table.DefaultView.Sort;
bool isAsc;
if(sort?.EndsWith("ASC") ?? false) {
sort = $"{clickedCol.ColumnName} DESC";
isAsc = false;
} else {
sort = $"{clickedCol.ColumnName} ASC";
isAsc = true;
// right click in a header
ShowHeaderContextMenu (clickedCol, e);
}
// set a sort order
tableView.Table.DefaultView.Sort = sort;
// copy the rows from the view
var sortedCopy = tableView.Table.DefaultView.ToTable ();
tableView.Table.Rows.Clear ();
foreach(DataRow r in sortedCopy.Rows) {
tableView.Table.ImportRow (r);
}
foreach(DataColumn col in tableView.Table.Columns) {
// remove any lingering sort indicator
col.ColumnName = col.ColumnName.TrimEnd ('▼', '▲');
// add a new one if this the one that is being sorted
if (col == clickedCol) {
col.ColumnName += isAsc ? '▲': '▼';
}
}
tableView.Update ();
}
};
}
private void ShowAllColumns ()
{
foreach(var colStyle in tableView.Style.ColumnStyles) {
colStyle.Value.Visible = true;
}
tableView.Update ();
}
private void SortColumn (DataColumn clickedCol)
{
// work out new sort order
var sort = tableView.Table.DefaultView.Sort;
bool isAsc;
if (sort?.EndsWith ("ASC") ?? false) {
sort = $"{clickedCol.ColumnName} DESC";
isAsc = false;
} else {
sort = $"{clickedCol.ColumnName} ASC";
isAsc = true;
}
// set a sort order
tableView.Table.DefaultView.Sort = sort;
// copy the rows from the view
var sortedCopy = tableView.Table.DefaultView.ToTable ();
tableView.Table.Rows.Clear ();
foreach (DataRow r in sortedCopy.Rows) {
tableView.Table.ImportRow (r);
}
foreach (DataColumn col in tableView.Table.Columns) {
// remove any lingering sort indicator
col.ColumnName = col.ColumnName.TrimEnd ('▼', '▲');
// add a new one if this the one that is being sorted
if (col == clickedCol) {
col.ColumnName += isAsc ? '▲' : '▼';
}
}
tableView.Update ();
}
private void ShowHeaderContextMenu (DataColumn clickedCol, View.MouseEventArgs e)
{
var contextMenu = new ContextMenu (e.MouseEvent.X + 1, e.MouseEvent.Y + 1,
new MenuBarItem (new MenuItem [] {
new MenuItem ($"Hide '{clickedCol.ColumnName}'", "", () => HideColumn(clickedCol)),
})
);
contextMenu.Show ();
}
private void HideColumn (DataColumn clickedCol)
{
var style = tableView.Style.GetOrCreateColumnStyle (clickedCol);
style.Visible = false;
tableView.Update ();
}
private DataColumn GetColumn ()
{