- new code to store preferred column order and width (that survives reordering with invisible columns)

- option to disable automatic column hiding/unhiding (and manually arrange all columns)
This commit is contained in:
Horst Beham
2021-09-12 23:02:24 +02:00
parent b1964f61d9
commit c831047f52
22 changed files with 5821 additions and 4419 deletions

View File

@@ -168,7 +168,7 @@
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
</Compile>
<Compile Include="Properties\Config.cs" />
<Compile Include="Config.cs" />
<Compile Include="ReferenceListForm.cs">
<SubType>Form</SubType>
</Compile>
@@ -214,7 +214,9 @@
<Compile Include="XGrid\XGridView.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="XGrid\XGridView.LayoutPersister.cs" />
<Compile Include="XGrid\XGridView.LayoutPersister.cs">
<SubType>Component</SubType>
</Compile>
<EmbeddedResource Include="AboutForm.cs.resx">
<DependentUpon>AboutForm.cs</DependentUpon>
</EmbeddedResource>

View File

@@ -4,13 +4,33 @@ using System.Drawing;
using System.IO;
using System.Xml.Serialization;
namespace ChanSort.Ui.Properties
namespace ChanSort.Ui
{
public class Config
{
private static readonly XmlSerializer Serializer;
private static readonly string ConfigFilePath;
#region class ColumnInfo
public class ColumnInfo
{
[XmlAttribute("name")] public string Name { get; set; }
[XmlAttribute("width")] public int Width { get; set; }
[XmlAttribute("visible")]//[Obsolete("For XML serialization only. Use Visible instead")]
public bool VisibleXml
{
get => this.Visible ?? true;
set => this.Visible = value;
}
[XmlIgnore]
public bool? Visible { get; set; }
}
#endregion
#region static ctor()
static Config()
{
@@ -53,8 +73,14 @@ namespace ChanSort.Ui.Properties
public bool ExplorerIntegration { get; set; } = false;
public bool CheckForUpdates { get; set; } = true;
public int FontSizeDelta { get; set; } = 1;
public string LeftGridLayout { get; set; }
public string RightGridLayout { get; set; }
// deprecated LeftGridLayout and RightGridLayout because they don't preserve order of invisible columns
//public string LeftGridLayout { get; set; }
//public string RightGridLayout { get; set; }
public List<ColumnInfo> LeftColumns { get; set; } = new();
public List<ColumnInfo> RightColumns { get; set; } = new();
public bool AutoHideColumns { get; set; } = true;
/// <summary>
/// The LeftGridLayout and RightGridLayout contain Width values which are scaled to this ScaleFactor.

View File

@@ -99,6 +99,7 @@ namespace ChanSort.Ui
this.rawImageCollection.Images.SetKeyName(46, "0046.png");
this.rawImageCollection.Images.SetKeyName(47, "0047.png");
this.rawImageCollection.Images.SetKeyName(48, "0048.png");
this.rawImageCollection.Images.SetKeyName(49, "0049.png");
((System.ComponentModel.ISupportInitialize)(this.rawImageCollection)).EndInit();
}

View File

@@ -124,12 +124,12 @@
<data name="rawImageCollection.ImageStream" type="DevExpress.Utils.ImageCollectionStreamer, DevExpress.Utils.v21.1" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFpEZXZFeHByZXNzLlV0aWxzLnYyMS4xLCBWZXJzaW9uPTIxLjEu
NC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI4OGQxNzU0ZDcwMGU0OWEMAwAAAFFT
NS4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI4OGQxNzU0ZDcwMGU0OWEMAwAAAFFT
eXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRv
a2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAAChEZXZFeHByZXNzLlV0aWxzLkltYWdlQ29sbGVjdGlvblN0
cmVhbWVyAgAAAAlJbWFnZVNpemUERGF0YQQHE1N5c3RlbS5EcmF3aW5nLlNpemUDAAAAAgIAAAAF/P//
/xNTeXN0ZW0uRHJhd2luZy5TaXplAgAAAAV3aWR0aAZoZWlnaHQAAAgIAwAAABAAAAAQAAAACQUAAAAP
BQAAAEKHAAAClgIAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAARnQU1BAACxjwv8
BQAAAPKIAAAClgIAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAI4SURBVDhP1ZJPSJRRFMXfskUbqbBw0SooJg1jKhVkMDMU
TKjGTBl0TDNEtDIXkTU55lT4D3Xsj6KGZhhmaUZqYOZgSlakqGOUSkgEE2kFjdjo982vzzdugqBldODx
znnvnsu99z3x71FV00ePc478G0OkX1pZA6Ra+3k3M8/9NCttZovkMVldRGf0EG7qIMn6hLqDJ8mvH0Q0
@@ -309,404 +309,411 @@
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
QN1JAAAAAElFTkSuQmCCCw==
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
AAAAE3RFWHRBdXRob3IAeXZlcyBndWlsbG91wpa1pQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBl
Lm9yZ5vuPBoAAAAcdEVYdFNvdXJjZQBPcGVuIENsaXAgQXJ0IExpYnJhcnmYx0j3AAAAvUlEQVQoUx1Q
2xZDQAxMFqEsRVVsUVSv//+DnchDMjNnTyazROw4YofiGJAoEUmzUy4YhRdJyElZnetGxLeXrhRHfO16
HcJtnGbtqztTXCyquoZtxnhkEfG9Nbg/0Yb6xdjhpzcIag1N7iDIuH2Mf8NPsBTCL3xN+GzjIeRNWI2r
vidvtq96AHnuaHML2yh7GNyOZ0sRw7bqdZ7GWxi0765mW3aXFima+lzZ6QjnixTZ8lOGkRzxkdvi4xeY
/lkoD7UQr/raAAAAAElFTkSuQmCCVQMAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgDAAAAKC0PUwAA
AARnQU1BAACxjwv8YQUAAAGAUExURUwtAIxUAItTAI1VAI5VAIpTAItUAI9WAP+aAP6aAN2FAK5oAJhb
AJdaAKdkAOKIAP+bAP+ZAKtnAINOAMp5AOWJAN6FALduAIZRAMN1ANmCAIZQAPCRAO+QAJFXAOOIAKJh
APeUAIhSALRsAJlcAE4uAN6GAP+dANB+AF86AKRjAMB0AC8cAJZaAOeKANqDAG9CAIVQAFAwAL9zAPuX
ANR/AOeMAG5CAFMyAAAAAKVjALZuAAUDADskAPGSAP6ZAGk/AHdHAIFOAEwuAJNYAG1BAJdbALpwAM98
ALVsAHpJAFk2AIBNAGY+AD8mAOWKAGM7AJ5fAKllAOuNAMZ3AMF0ADIeAEAnAIdRAGc+ABkPAJJXAOGH
APaUAP+cAPaVAGY9ACIVAE4vADQfAFQzANB9ANeBAJVZAFw3AHJFAHFEAHNFAK1oAPuWAHZHAJBXAK9p
AKNiAKpmAKxnAJxdAN+GAOSJAL5yAP2ZAPiWAO6PAPKRAL1xAPSTAIlSAIJOANqKz9QAAAAJcEhZcwAA
FrkAABa5Af4CN94AAAATdEVYdEF1dGhvcgB5dmVzIGd1aWxsb3XClrWlAAAAGXRFWHRTb2Z0d2FyZQB3
d3cuaW5rc2NhcGUub3Jnm+48GgAAABx0RVh0U291cmNlAE9wZW4gQ2xpcCBBcnQgTGlicmFyeZjHSPcA
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
z+VS/hgMz1sT9Nk+vJeFAAAAAElFTkSuQmCCCw==
</value>
</data>
<metadata name="$this.TrayLargeIcon" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

File diff suppressed because it is too large Load Diff

View File

@@ -55,6 +55,9 @@ namespace ChanSort.Ui
private int subListIndex;
private SizeF absScaleFactor = new SizeF(1,1);
private bool splitView = true;
private readonly List<GridColumn> columnOrderLeft = new();
private readonly List<GridColumn> columnOrderRight = new();
private int ignoreEvents;
#region ctor()
@@ -118,9 +121,11 @@ namespace ChanSort.Ui
if (col.Visible)
defaultColumns.Add(col.FieldName);
}
ChannelList.DefaultVisibleColumns = defaultColumns;
this.UpdateMenu(true); // disable menu items that depend on an open file
this.SaveColumnOrder(this.gviewLeft, this.columnOrderLeft);
this.SaveColumnOrder(this.gviewRight, this.columnOrderRight);
}
#endregion
@@ -1417,32 +1422,111 @@ namespace ChanSort.Ui
}
}
if (Config.Default.LeftGridLayout != null)
{
this.gridLeft.ForceInitialize();
var xml = Config.Default.LeftGridLayout;
this.gviewLeft.LoadLayoutFromXml(xml);
if (Config.Default.ScaleFactor.Width != 0)
{
foreach (GridColumn col in this.gviewLeft.Columns)
col.Width = (int) (col.Width / Config.Default.ScaleFactor.Width);
}
}
if (Config.Default.RightGridLayout != null)
{
this.gridRight.ForceInitialize();
var xml = Config.Default.RightGridLayout;
this.gviewRight.LoadLayoutFromXml(xml);
if (Config.Default.ScaleFactor.Width != 0)
{
foreach (GridColumn col in this.gviewRight.Columns)
col.Width = (int) (col.Width / Config.Default.ScaleFactor.Width);
}
}
//if (Config.Default.LeftGridLayout != null)
//{
// this.gridLeft.ForceInitialize();
// var xml = Config.Default.LeftGridLayout;
// this.gviewLeft.LoadLayoutFromXml(xml);
// if (Config.Default.ScaleFactor.Width != 0)
// {
// foreach (GridColumn col in this.gviewLeft.Columns)
// col.Width = (int) (col.Width / Config.Default.ScaleFactor.Width);
// }
//}
this.LoadGridLayout(this.gviewLeft, Config.Default.LeftColumns, this.columnOrderLeft);
this.LoadGridLayout(this.gviewRight, Config.Default.RightColumns, this.columnOrderRight);
this.miAutoHideColumns.Down = Config.Default.AutoHideColumns;
//if (Config.Default.RightGridLayout != null)
//{
// this.gridRight.ForceInitialize();
// var xml = Config.Default.RightGridLayout;
// this.gviewRight.LoadLayoutFromXml(xml);
// if (Config.Default.ScaleFactor.Width != 0)
// {
// foreach (GridColumn col in this.gviewRight.Columns)
// col.Width = (int) (col.Width / Config.Default.ScaleFactor.Width);
// }
//}
this.miSplitView.Down = Config.Default.SplitView; // will change column visibility and must happen after restoring the grid layout
}
private void SaveColumnOrder(GridView view, List<GridColumn> columns)
{
// for this to work, the columns in absolute index order must represent the intended visible order
columns.AddRange(view.Columns.OrderBy(c => c.AbsoluteIndex));
}
private void LoadGridLayout(XGridView view, List<Config.ColumnInfo> configColumns, List<GridColumn> list)
{
// must handle situations where new columns were added to the program, which are not included in the config
// These columns should be kept at their relative position in the default visible order
// build a dictionary with FieldName => "desired visible order"
var colsInConfig = new Dictionary<string,int>();
int visIndex = 0;
foreach (var info in configColumns)
{
if (view.Columns[info.Name] != null)
colsInConfig.Add(info.Name, visIndex++);
}
++this.ignoreEvents;
var oldList = new List<GridColumn>(list);
var newList = new List<GridColumn>();
foreach (var info in configColumns)
{
var col = view.Columns[info.Name];
// ignore columns from config that don't exist in the program
if (col == null)
continue;
col.Width = info.Width.Scale(this.absScaleFactor.Width);
// prepend columns that don't exist in the config and come before the current column in the default order
while (oldList.Count > 0)
{
var oldCol = oldList[0];
if (oldCol == col)
break;
if (colsInConfig.ContainsKey(oldCol.FieldName))
break;
newList.Add(oldCol);
oldList.Remove(oldCol);
}
newList.Add(col);
oldList.Remove(col);
}
newList.AddRange(oldList);
list.Clear();
list.AddRange(newList);
--this.ignoreEvents;
}
private void SaveGridLayout(List<Config.ColumnInfo> configColumns, List<GridColumn> list)
{
var oldCfg = new Dictionary<string, Config.ColumnInfo>();
foreach (var info in configColumns)
oldCfg[info.Name] = info;
var setVisible = !this.miAutoHideColumns.Down;
configColumns.Clear();
foreach (var col in list)
{
var info = new Config.ColumnInfo();
info.Name = col.FieldName;
info.Width = col.Width.Unscale(this.absScaleFactor.Width);
info.Visible = setVisible ? col.Visible : oldCfg.TryGetValue(col.FieldName, out var oldInfo) ? oldInfo.Visible : null;
configColumns.Add(info);
}
}
#endregion
#region SelectLanguageMenuItem()
@@ -1464,35 +1548,6 @@ namespace ChanSort.Ui
#endregion
#region SetGridLayout()
private void SetGridLayout(GridView grid, string layout)
{
if (string.IsNullOrEmpty(layout)) return;
var stream = new MemoryStream();
using (var wrt = new StreamWriter(stream))
{
wrt.Write(layout);
wrt.Flush();
stream.Seek(0, SeekOrigin.Begin);
var options = new OptionsLayoutGrid();
options.StoreDataSettings = true;
options.StoreAppearance = false;
options.StoreVisualOptions = false;
grid.RestoreLayoutFromStream(stream, options);
}
// put the filter text back into the auto-filter-row
foreach (GridColumn col in grid.Columns)
{
var parts = (col.FilterInfo.FilterString ?? "").Split('\'');
if (parts.Length >= 2)
this.gviewRight.SetRowCellValue(GridControl.AutoFilterRowHandle, col, parts[1]);
}
}
#endregion
#region UpdateInsertSlotNumber()
private void UpdateInsertSlotNumber()
@@ -1585,12 +1640,30 @@ namespace ChanSort.Ui
#endregion
#region UpdateColumnVisibility()
private void UpdateColumnVisiblity()
{
this.ShowGridColumns(this.gviewLeft);
this.ShowGridColumns(this.gviewRight);
}
#endregion
#region ShowGridColumns()
private void ShowGridColumns(XGridView gview)
{
foreach (GridColumn col in gview.Columns)
gview.SetColumnVisibility(col, GetGridColumnVisibility(col));
//foreach (GridColumn col in gview.Columns)
// gview.SetColumnVisibility(col, GetGridColumnVisibility(col));
var list = gview == this.gviewLeft ? this.columnOrderLeft : this.columnOrderRight;
var visIndex = 0;
++this.ignoreEvents;
foreach (var col in list)
{
col.VisibleIndex = GetGridColumnVisibility(col) ? visIndex++ : -1;
}
--this.ignoreEvents;
}
#endregion
@@ -1599,6 +1672,15 @@ namespace ChanSort.Ui
private bool GetGridColumnVisibility(GridColumn col)
{
if (!this.miAutoHideColumns.Down)
{
var config = col.View == this.gviewLeft ? Config.Default.LeftColumns : Config.Default.RightColumns;
var info = config.FirstOrDefault(c => c.Name == col.FieldName);
if (info != null && info.Visible.HasValue)
return info.Visible.Value;
return col.Tag is bool originalVisible && originalVisible;
}
var list = this.CurrentChannelList;
if (list == null)
return false;
@@ -1608,7 +1690,7 @@ namespace ChanSort.Ui
if (col == this.colSource || col == this.colOutSource) return true;
if (col == this.colOutHide || col == this.colOutLock || col == this.colOutSkip) return false;
}
var filter = list.VisibleColumnFieldNames;
if (filter != null)
{
@@ -1625,6 +1707,7 @@ namespace ChanSort.Ui
if (col == this.colFavorites) return this.DataRoot.SupportedFavorites != 0;
if (col == this.colOutFav) return this.DataRoot.SupportedFavorites != 0;
if (col == this.colPrNr) return this.subListIndex > 0;
if (col == this.colChannelOrTransponder) return (source & SignalSource.Sat) == 0;
if (col == this.colShortName) return (source & SignalSource.Digital) != 0;
if (col == this.colEncrypted) return (source & SignalSource.Digital) != 0;
@@ -2078,6 +2161,7 @@ namespace ChanSort.Ui
}
#endregion
// UI events
@@ -2805,6 +2889,40 @@ namespace ChanSort.Ui
#endregion
#region gviewLeft_ColumnPositionChanged, gviewRight_ColumnPositionChanged
private void gviewLeft_ColumnPositionChanged(object sender, EventArgs e)
{
TryExecute(() => this.ColumnPositionChanged((GridColumn)sender, this.columnOrderLeft));
}
private void gviewRight_ColumnPositionChanged(object sender, EventArgs e)
{
TryExecute(() => this.ColumnPositionChanged((GridColumn)sender, this.columnOrderRight));
}
private void ColumnPositionChanged(GridColumn col, List<GridColumn> list)
{
if (this.ignoreEvents > 0)
return;
// columnOrderLeft and columnOrderRight are kept in desired column order including hidden columns
// when a column is moved to a new visible position, it is put behind all columns (including invisible ones) that have a lower position
var visIdx = col.VisibleIndex;
if (visIdx < 0)
return;
var listIdx = list.IndexOf(col);
list.RemoveAt(listIdx);
int i;
for (i = 0; i < list.Count; i++)
{
if (list[i].VisibleIndex >= 0 && list[i].VisibleIndex >= visIdx)
break;
}
list.Insert(i, col);
}
#endregion
#region rbInsertMode_CheckedChanged
@@ -2981,8 +3099,9 @@ namespace ChanSort.Ui
config.ExplorerIntegration = this.miExplorerIntegration.Down;
config.CheckForUpdates = this.miCheckUpdates.Down;
config.SplitView = this.miSplitView.Down;
config.LeftGridLayout = this.gviewLeft.SaveLayoutToXml();
config.RightGridLayout = this.gviewRight.SaveLayoutToXml();
this.SaveGridLayout(config.LeftColumns, this.columnOrderLeft);
this.SaveGridLayout(config.RightColumns, this.columnOrderRight);
config.AutoHideColumns = this.miAutoHideColumns.Down;
config.ScaleFactor = this.absScaleFactor;
config.Save();
@@ -3500,6 +3619,13 @@ namespace ChanSort.Ui
}
#endregion
#region miAutoHideColumns_DownChanged
private void miAutoHideColumns_DownChanged(object sender, ItemClickEventArgs e)
{
this.TryExecute(this.UpdateColumnVisiblity);
}
#endregion
#endregion
#region Help menu
@@ -3714,5 +3840,6 @@ namespace ChanSort.Ui
}
#endregion
}
}

View File

@@ -610,6 +610,6 @@
<value>Přepnout oblíbené H</value>
</data>
<data name="miTheme.Caption" xml:space="preserve">
<value>Barevné schéma</value>
<value>Barevné schéma...</value>
</data>
</root>

File diff suppressed because it is too large Load Diff

View File

@@ -661,6 +661,6 @@
<value>Copiar lista al portapapeles</value>
</data>
<data name="miTheme.Caption" xml:space="preserve">
<value>Esquema de colores</value>
<value>Esquema de colores...</value>
</data>
</root>

View File

@@ -664,7 +664,7 @@
<value>splitContainerControl1</value>
</data>
<data name="miTheme.Caption" xml:space="preserve">
<value>Színösszeállítás</value>
<value>Színösszeállítás...</value>
</data>
<data name="btnSearchLeft.AccessibleDescription" xml:space="preserve">
<value>Egy csatorna keresése</value>

View File

@@ -664,6 +664,6 @@
<value>splitContainerControl1</value>
</data>
<data name="miTheme.Caption" xml:space="preserve">
<value>Schemat kolorów</value>
<value>Schemat kolorów...</value>
</data>
</root>

View File

@@ -371,6 +371,6 @@
</value>
</data>
<data name="miTheme.Caption" xml:space="preserve">
<value>Esquema de cores</value>
<value>Esquema de cores...</value>
</data>
</root>

File diff suppressed because it is too large Load Diff

View File

@@ -628,6 +628,6 @@ furnizor specific, satelit sau liste de țări.</value>
<value>Comutați pe Favorite H</value>
</data>
<data name="miTheme.Caption" xml:space="preserve">
<value>Schema de culori</value>
<value>Schema de culori...</value>
</data>
</root>

View File

@@ -469,6 +469,6 @@
<value>Индекс пр.</value>
</data>
<data name="miTheme.Caption" xml:space="preserve">
<value>Цветовая схема</value>
<value>Цветовая схема...</value>
</data>
</root>

View File

@@ -664,6 +664,6 @@
<value>bölünmüşBirimKontrolü1</value>
</data>
<data name="miTheme.Caption" xml:space="preserve">
<value>Renk uyumu</value>
<value>Renk uyumu...</value>
</data>
</root>

View File

@@ -1,7 +1,5 @@
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraEditors.ViewInfo;
@@ -10,7 +8,6 @@ using DevExpress.XtraGrid.Registrator;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using DevExpress.XtraPrinting;
namespace ChanSort
{
@@ -19,6 +16,8 @@ namespace ChanSort
{
private bool eventsInstalled;
private readonly Timer timerEditDelay;
private bool dontOpenEditor;
private bool advancedMouseHandling;
#region ctor
public XGridControl()
@@ -31,6 +30,17 @@ namespace ChanSort
}
#endregion
#region Dispose()
protected override void Dispose(bool disposing)
{
if (disposing)
{
this.timerEditDelay.Dispose();
}
base.Dispose(disposing);
}
#endregion
#region AdvancedMouseHandling
[DefaultValue(true)]
public bool AdvancedMouseHandling
@@ -45,22 +55,6 @@ namespace ChanSort
}
#endregion
[DefaultValue(null)]
public string LayoutId { get; set; }
[DefaultValue(true)]
public bool AllowDefaultLoadingLayout { get; set; } = true;
#region PrintHeader
[DefaultValue(null)]
public string PrintHeader { get; set; }
[DefaultValue(null)]
public string PrintHeader2 { get; set; }
#endregion
#region CreateDefaultView()
protected override BaseView CreateDefaultView()
{
@@ -115,94 +109,6 @@ namespace ChanSort
}
#endregion
#region OnHandleDestroyed()
protected override void OnHandleDestroyed(EventArgs e)
{
base.OnHandleDestroyed(e);
this.RaiseSaveLayout();
}
#endregion
#region Dispose()
protected override void Dispose(bool disposing)
{
if (disposing)
{
this.timerEditDelay.Dispose();
this.RaiseSaveLayout();
}
base.Dispose(disposing);
}
#endregion
#region Layout handling - RaiseLoadLayout(), RaiseSaveLayout()
/// <summary>
/// Raises the LoadLayout event. Requires that PopulateGrid() has been called before
/// </summary>
/// <returns>true if an eventhandler is installed </returns>
public bool RaiseLoadLayout()
{
GridLayoutEventArgs args = new GridLayoutEventArgs(this, this.LayoutId);
try
{
XGridView view = this.MainView as XGridView;
view?.SaveInitialLayout();
this.LoadingLayout?.Invoke(this, args);
if (!args.Handled && this.AllowDefaultLoadingLayout)
DefaultLoadingLayout?.Invoke(this, args);
}
catch { }
return args.Handled;
}
/// <summary>
/// Raises the SaveLayout event handler to save the grid's column width and ordering.
/// Requires that PopulateGrid() has been called before
/// </summary>
/// <returns>true if an event handler is installed</returns>
public bool RaiseSaveLayout()
{
GridLayoutEventArgs args = new GridLayoutEventArgs(this, this.LayoutId);
try
{
this.SavingLayout?.Invoke(this, args);
if (!args.Handled)
DefaultSavingLayout?.Invoke(this, args);
}
catch { }
return args.Handled;
}
#endregion
#region events DefaultSavingLayout, DefaultLoadingLayout, SavingLayout, LoadingLayout
public delegate void GridLayoutEventHandler(object sender, GridLayoutEventArgs e);
/// <summary>
/// This delegate gets called, when no SavingLayout handler is installed on the GridAdapter instance
/// </summary>
public static GridLayoutEventHandler DefaultSavingLayout;
/// <summary>
/// Gets called when the grid should load its layout
/// </summary>
public event GridLayoutEventHandler SavingLayout;
/// <summary>
/// This delegate gets called, when no LoadingLayout handler is installed on the GridAdapter instance
/// </summary>
public static GridLayoutEventHandler DefaultLoadingLayout;
/// <summary>
/// Gets called when the grid should save its layout
/// </summary>
public event GridLayoutEventHandler LoadingLayout;
private bool dontOpenEditor;
private bool advancedMouseHandling;
internal bool isExporting;
#endregion
#region gview_MouseDown, gview_MouseUp, timerEditDelay_Tick, gview_ShowingEditor
@@ -326,84 +232,5 @@ namespace ChanSort
}
}
#endregion
#region ShowExportDialog()
public void ShowExportDialog()
{
using (var dlg = new SaveFileDialog())
{
dlg.Title = "Tabelle exportieren";
dlg.RestoreDirectory = true;
dlg.AddExtension = true;
dlg.DefaultExt = ".xlsx";
dlg.Filter = "Excel Datei|*.xlsx|PDF-Dokument|*.pdf|CSV-Tabelle|*.csv|Rich-Text|*.rtf";
dlg.FilterIndex = 1;
dlg.AutoUpgradeEnabled = true;
dlg.CheckPathExists = true;
dlg.ValidateNames = true;
if (dlg.ShowDialog() != DialogResult.OK)
return;
try
{
this.isExporting = true;
switch ((Path.GetExtension(dlg.FileName) ?? "").ToLowerInvariant())
{
case ".xlsx":
this.ExportToXlsx(dlg.FileName);
break;
case ".csv":
this.ExportToCsv(dlg.FileName);
break;
case ".pdf":
this.ExportToPdf(dlg.FileName);
break;
case ".rtf":
this.ExportToRtf(dlg.FileName);
break;
default:
TextExportOptions opt = new TextExportOptions();
opt.Separator = "\t";
this.ExportToText(dlg.FileName, opt);
break;
}
}
finally
{
this.isExporting = false;
}
ProcessStartInfo psi = new ProcessStartInfo();
psi.UseShellExecute = true;
psi.FileName = dlg.FileName;
Process.Start(psi);
}
}
#endregion
#region OnKeyDown()
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyData == (Keys.Add | Keys.Control))
e.Handled = ((XGridView) this.MainView).SmartExpand();
else if (e.KeyData == (Keys.Subtract | Keys.Control))
e.Handled = ((XGridView) this.MainView).SmartCollapse();
base.OnKeyDown(e);
}
#endregion
#region OnSizeChanged() / OnLayout()
protected override void OnSizeChanged(EventArgs e)
{
// attempt to work around a windows bug/limitation with kernel stack overflow when controls are nested too deeply:
// http://blogs.msdn.com/b/alejacma/archive/2008/11/20/controls-won-t-get-resized-once-the-nesting-hierarchy-of-windows-exceeds-a-certain-depth-x64.aspx?Redirected=true
if (this.IsHandleCreated)
this.BeginInvoke((Action)(() => base.OnSizeChanged(e)));
else
base.OnSizeChanged(e);
}
#endregion
}
}

View File

@@ -6,267 +6,33 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using ChanSort.Api;
using DevExpress.Data;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Grid;
namespace ChanSort
{
#region class GridLayoutEventArgs
public class GridLayoutEventArgs : EventArgs
{
public readonly XGridControl GridControl;
public readonly XGridView GridView;
public readonly string ControlId;
public bool Handled = false;
public GridLayoutEventArgs(XGridControl gc, string controlId)
{
this.GridControl = gc;
this.GridView = (XGridView)gc.MainView;
this.ControlId = controlId;
}
}
#endregion
public partial class XGridView
{
#region enum ColumnOptions
[Flags]
public enum ColumnOptions
public void StoreVisibleOrder()
{
None = 0x00,
OrderAndVisibility = 0x01,
SortingAndGrouping = 0x02,
All = 0x03,
}
#endregion
#region class GridColumnInfo
internal class GridColumnInfo
{
public readonly string FieldName;
public int Width;
public int VisibleIndex;
public int InvisibleIndex;
public int SortIndex;
public ColumnSortOrder SortOrder;
public int GroupIndex;
public GridColumnInfo(string fieldName)
{
this.FieldName = fieldName;
this.SortIndex = -1;
this.GroupIndex = -1;
this.InvisibleIndex = -1;
}
}
#endregion
public static float ColumnWidthDpiScale = 1f; // used to work around the autoscaling of DevExpress 18.1 grid column width
#region SaveLayoutToXml()
/// <summary>
/// Save column widths and visible indices to a XmlWriter
/// </summary>
public string SaveLayoutToXml()
{
var gridView = this;
var sb = new StringBuilder();
var settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
using var xmlWriter = XmlWriter.Create(sb, settings);
xmlWriter.WriteStartElement("GridColumns");
xmlWriter.WriteAttributeString("widthScale", ColumnWidthDpiScale.ToString(NumberFormatInfo.InvariantInfo));
int count = gridView.Columns.Count;
for (int i = 0; i < count; i++)
{
GridColumn col = gridView.Columns[i];
xmlWriter.WriteRaw("\r\n");
xmlWriter.WriteStartElement("Column");
xmlWriter.WriteAttributeString("FieldName", col.FieldName);
xmlWriter.WriteElementString("GroupIndex", col.GroupIndex.ToString());
xmlWriter.WriteElementString("VisibleIndex", col.VisibleIndex.ToString());
xmlWriter.WriteElementString("InvisibleIndex", this.columnOrder.IndexOf(col).ToString());
xmlWriter.WriteElementString("Width", col.Width.ToString());
xmlWriter.WriteElementString("SortIndex", col.SortIndex.ToString());
xmlWriter.WriteElementString("SortOrder", col.SortOrder.ToString());
xmlWriter.WriteEndElement();
}
xmlWriter.WriteRaw("\r\n");
xmlWriter.WriteEndElement();
xmlWriter.Flush();
return sb.ToString();
}
#endregion
#region LoadLayoutFromXml()
/// <summary>
/// Load column widths and visible indices from a XmlReader
/// </summary>
public void LoadLayoutFromXml(string xml, ColumnOptions options = ColumnOptions.All)
{
if (string.IsNullOrEmpty(xml))
return;
var gridView = this;
XmlDocument doc = new XmlDocument();
doc.Load(new StringReader(xml));
XmlNode root = doc.FirstChild;
List<GridColumnInfo> cols = new List<GridColumnInfo>();
// gültiges Root-Element prüfen
if (!root.Name.Equals("GridColumns"))
return;
var ws = root.Attributes?["widthScale"]?.Value;
var storedScale = ws != null ? float.Parse(ws, CultureInfo.InvariantCulture) : ColumnWidthDpiScale;
float scaleCorrection = gridView.GridControl.ScaleFactor.Width / storedScale;
for (XmlNode node = root.FirstChild; node != null; node = node.NextSibling)
{
var ci = ReadColumnInfoAndSetWidth(node, gridView, scaleCorrection);
if (ci != null)
cols.Add(ci);
}
//gridView.BeginUpdate();
if ((options & ColumnOptions.OrderAndVisibility) != 0)
RestoreVisibleOrder(cols);
if ((options & ColumnOptions.SortingAndGrouping) != 0)
RestoreGroupingAndSorting(gridView, cols);
//gridView.EndUpdate();
}
#endregion
#region ReadColumnInfoAndSetWidth()
private static GridColumnInfo ReadColumnInfoAndSetWidth(XmlNode node, GridView gridView, float scaleCorrection)
{
if (!node.Name.Equals("Column"))
return null;
var fieldName = node.Attributes["FieldName"].Value;
var col = gridView.Columns[fieldName];
var ci = new GridColumnInfo(fieldName);
var conv = new EnumConverter(typeof(ColumnSortOrder));
for (XmlNode item = node.FirstChild; item != null; item = item.NextSibling)
{
if (item.Name.Equals("Width"))
{
ci.Width = Convert.ToInt32(item.InnerText);
if (col != null)
col.Width = (int) Math.Round(ci.Width * scaleCorrection, 0);
}
else if (item.Name.Equals("VisibleIndex"))
ci.VisibleIndex = Convert.ToInt32(item.InnerText);
else if (item.Name == "InvisibleIndex")
ci.InvisibleIndex = Convert.ToInt32(item.InnerText);
else if (item.Name.Equals("SortIndex"))
ci.SortIndex = Convert.ToInt32(item.InnerText);
else if (item.Name.Equals("SortOrder"))
ci.SortOrder = (ColumnSortOrder) conv.ConvertFromString(item.InnerText);
else if (item.Name.Equals("GroupIndex"))
ci.GroupIndex = int.Parse(item.InnerText);
}
return ci;
}
#endregion
#region RestoreVisibleOrder()
internal void RestoreVisibleOrder(List<GridColumnInfo> cols)
{
var gridView = this;
var frow = gridView.FocusedRowHandle;
var fcol = gridView.FocusedColumn;
gridView.BeginUpdate();
gridView.ClearGrouping();
var oldVisibleColumns = this.VisibleColumns.ToList();
foreach (GridColumn col in gridView.Columns)
col.VisibleIndex = -1;
// place new column based on the original order
// place invisible column based on the absolute order
this.columnOrder.Clear();
int visIndex = 0;
var newVisList = new List<GridColumn>();
bool hasInvisOrder = cols.Any(ci => ci.InvisibleIndex >= 0);
var visibleColumns = new List<GridColumn>();
foreach (GridColumn col in this.columnOrder)
var comparer = new DelegateComparer<GridColumn>((a, b) => Tools.FirstNotDefault(a.VisibleIndex.CompareTo(b.VisibleIndex), a.AbsoluteIndex.CompareTo(b.AbsoluteIndex)));
var cleanVisList = this.Columns.Where(c => c.VisibleIndex >= 0).OrderBy(c => c, comparer).ToList();
foreach (GridColumn col in this.Columns)
{
if (!cols.Any(c => c.FieldName == col.FieldName && (c.InvisibleIndex >= 0 || c.VisibleIndex >= 0)))
{
newVisList.Add(col);
if (oldVisibleColumns.Contains(col))
visibleColumns.Add(col);
}
if (!col.Visible)
this.columnOrder.Add(col);
else
{
while (visIndex < cols.Count)
{
var ci = cols.FirstOrDefault(c => hasInvisOrder ? c.InvisibleIndex == visIndex : c.VisibleIndex == visIndex);
visIndex++;
var visCol = ci != null ? this.Columns[ci.FieldName] : null;
if (visCol != null)
{
newVisList.Add(visCol);
if (ci.VisibleIndex >= 0)
visibleColumns.Add(visCol);
break;
}
}
this.columnOrder.Add(cleanVisList[visIndex]);
visIndex++;
}
}
visIndex = 0;
foreach (var col in newVisList)
col.VisibleIndex = visibleColumns.Contains(col) ? visIndex++ : -1;
this.columnOrder.Clear();
this.columnOrder.AddRange(newVisList);
gridView.FocusedRowHandle = frow;
if (fcol != null && fcol.Visible)
gridView.FocusedColumn = fcol;
gridView.EndUpdate();
}
#endregion
#region RestoreGroupingAndSorting()
private static void RestoreGroupingAndSorting(GridView gridView, List<GridColumnInfo> cols)
{
bool mayGroup = gridView.OptionsCustomization.AllowGroup;
int groupCount = 0;
List<GridColumnInfo> sortColumns = new List<GridColumnInfo>();
foreach (GridColumnInfo ci in cols.Where(ci => ci.SortIndex >= 0 || ci.GroupIndex >= 0).OrderBy(ci => ci.GroupIndex + (ci.SortIndex + 1) * 1000))
{
sortColumns.Add(ci);
if (ci.GroupIndex >= 0)
++groupCount;
}
GridColumnSortInfo[] sortInfo = new GridColumnSortInfo[sortColumns.Count];
int i = 0;
foreach (var ci in sortColumns)
sortInfo[i++] = new GridColumnSortInfo(gridView.Columns[ci.FieldName], ci.SortOrder);
gridView.SortInfo.ClearAndAddRange(sortInfo, mayGroup ? groupCount : 0);
gridView.OptionsView.ShowGroupPanel |= mayGroup && groupCount > 0;
}
#endregion
}
}

View File

@@ -20,40 +20,17 @@ namespace ChanSort
{
public partial class XGridView : GridView
{
private byte[] initialLayout;
private readonly List<GridColumn> columnOrder = new List<GridColumn>();
protected override string ViewName => "XGridView";
private int expandLevel;
#region ctor
public XGridView() : this(null) { }
public XGridView(GridControl grid) : base(grid)
{
this.OptionsPersistence = XGridView.ColumnOptions.All;
this.AllowSmartExpand = true;
}
#endregion
public void StoreVisibleOrder()
{
// place invisible column based on the absolute order
this.columnOrder.Clear();
int visIndex = 0;
var comparer = new DelegateComparer<GridColumn>((a, b) => Tools.FirstNotDefault(a.VisibleIndex.CompareTo(b.VisibleIndex), a.AbsoluteIndex.CompareTo(b.AbsoluteIndex)));
var cleanVisList = this.Columns.Where(c => c.VisibleIndex >= 0).OrderBy(c => c, comparer).ToList();
foreach (GridColumn col in this.Columns)
{
if (!col.Visible)
this.columnOrder.Add(col);
else
{
this.columnOrder.Add(cleanVisList[visIndex]);
visIndex++;
}
}
}
public override void EndInit()
{
base.EndInit();
@@ -126,73 +103,6 @@ namespace ChanSort
internal new GridViewInfo ViewInfo => base.ViewInfo;
#region AllowSmartExpand
[Browsable(true), DefaultValue(true)]
public bool AllowSmartExpand { get; set; }
#endregion
#region OptionsPersistence
[Browsable(true), Description("Options for persisting customization details")]
public ColumnOptions OptionsPersistence { get; set; }
#endregion
#region GetRowCellValue()
public override object GetRowCellValue(int rowHandle, GridColumn column)
{
// Workaround for "#N/A" text when exporting to Excel
var val = base.GetRowCellValue(rowHandle, column);
if (val != null && ((XGridControl)this.GridControl).isExporting)
{
var type = val.GetType();
if (!type.IsPrimitive && type != typeof(decimal) && type != typeof(DateTime))
return val.ToString();
}
return val;
}
#endregion
#region SaveInitialLayout(), RestoreInitialLayout()
internal void SaveInitialLayout()
{
if (this.initialLayout != null) return;
using (var strm = new MemoryStream())
{
this.SaveLayoutToStream(strm);
this.initialLayout = strm.GetBuffer();
}
if (this.columnOrder.Count == 0)
this.StoreVisibleOrder();
}
public void RestoreInitialLayout()
{
if (this.initialLayout == null) return;
using (var strm = new MemoryStream(this.initialLayout))
this.RestoreLayoutFromStream(strm);
this.StoreVisibleOrder();
}
#endregion
#region SmartExpand(), SmartCollapse()
public bool SmartExpand()
{
if (this.expandLevel >= this.GroupCount)
return false;
this.ExpandGroupLevel(this.expandLevel, false);
++expandLevel;
return true;
}
public bool SmartCollapse()
{
if (this.expandLevel == 0)
return false;
--expandLevel;
this.CollapseGroupLevel(this.expandLevel, false);
return true;
}
#endregion
#region ShowEditor()
public override void ShowEditor()

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

View File

@@ -158,4 +158,68 @@ public struct Philips_mgr_chan_dvbt
CChannel channels[recordCount];
SFooter footer;
};
#pragma byte_order(LittleEndian)
struct ProgNr
{
WORD nr : 14;
WORD flags : 2;
};
public struct Philips_FLASH_DTVINFO_S_FTA
{
char ddtc[4];
var off0 = current_offset;
struct
{
struct
{
WORD u1 : 3;
WORD isRadio: 1;
WORD u2 : 1;
WORD transponderIndex : 11;
} info;
WORD chanIdx;
} chanIndexInfo[(0x5f2c - off0)/4];
off0 = current_offset;
struct s_transponder
{
var off1 = current_offset;
WORD id;
WORD u1;
WORD freqInMhz;
WORD symbolRate;
BYTE u2[2];
WORD onid;
WORD tsid;
WORD nid;
BYTE u3[5];
WORD freqInMhz2;
BYTE u4[8];
} transponder[(0x10000 - off0)/sizeof(s_transponder)];
BYTE filler[4];
char ddtc2[4];
struct s_channel
{
WORD idx1;
BYTE u1[4];
BYTE u2[2];
WORD sid;
WORD pcrPid;
WORD vpid;
BYTE u3[8];
ProgNr progNr;
BYTE u3b[7];
WORD apid1_maybe;
char lang1[3];
BYTE u4[45];
WORD apid2_maybe;
char lang2[3];
BYTE u5[3];
} channel[*];
};

Binary file not shown.