From 0a71f3463933489e7c7398d61e4dca24b795ca3f Mon Sep 17 00:00:00 2001 From: hbeham Date: Thu, 5 May 2016 03:06:11 +0200 Subject: [PATCH] CsvFileSerializer and RefSerializer are now back in the .Api project. CSV, TXT and CHL files can now be loaded and edited like any other supported channel list. Eleminated redundant code that was used for loading/applying reference lists in CSV or TXT/CHL format. --- source/ChanSort.Api/ChanSort.Api.csproj | 2 + .../Controller/CsvFileSerializer.cs | 341 +-- .../Controller}/RefSerializer.cs | 13 +- .../Controller/RefSerializerPlugin.cs | 20 + .../ChanSort.Api/Controller/SerializerBase.cs | 3 + .../ChanSort.Loader.RefList.csproj | 2 - .../RefSerializerPlugin.cs | 16 - source/ChanSort.sln | 15 - source/ChanSort/ChanSort.csproj | 4 - source/ChanSort/MainForm.cs | 2187 +++++++++-------- 10 files changed, 1420 insertions(+), 1183 deletions(-) rename source/{ChanSort.Loader.RefList => ChanSort.Api/Controller}/RefSerializer.cs (93%) create mode 100644 source/ChanSort.Api/Controller/RefSerializerPlugin.cs delete mode 100644 source/ChanSort.Loader.RefList/RefSerializerPlugin.cs diff --git a/source/ChanSort.Api/ChanSort.Api.csproj b/source/ChanSort.Api/ChanSort.Api.csproj index 807ff5a..3bbf3ae 100644 --- a/source/ChanSort.Api/ChanSort.Api.csproj +++ b/source/ChanSort.Api/ChanSort.Api.csproj @@ -61,6 +61,8 @@ + + diff --git a/source/ChanSort.Api/Controller/CsvFileSerializer.cs b/source/ChanSort.Api/Controller/CsvFileSerializer.cs index a860f93..0db3730 100644 --- a/source/ChanSort.Api/Controller/CsvFileSerializer.cs +++ b/source/ChanSort.Api/Controller/CsvFileSerializer.cs @@ -1,57 +1,64 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; namespace ChanSort.Api { /// - /// Reads a reference list from a .csv file with the format - /// [dummy1],ProgramNr,[dummy2],UID,ChannelName[,SignalSource,FavAndFlags] + /// Reads a reference list from a .csv file with the format + /// [dummy1],ProgramNr,[dummy2],UID,ChannelName[,SignalSource,FavAndFlags] /// - public class CsvFileSerializer + public class CsvFileSerializer : SerializerBase { - private readonly HashSet clearedLists = new HashSet(); - private readonly DataRoot dataRoot; - private readonly string fileName; - private readonly bool addChannels; + private static readonly List Columns = new List + { + "OldPosition", + "Position", + "Name", + "OriginalNetworkId", + "TransportStreamId", + "ServiceId", + "Favorites", + "Skip", + "Lock", + "Hidden" + }; #region ctor() - public CsvFileSerializer(string fileName, DataRoot dataRoot, bool addChannels) + + public CsvFileSerializer(string fileName) : base(fileName) { - this.fileName = fileName; - this.dataRoot = dataRoot; - this.addChannels = addChannels; + this.Features.ChannelNameEdit = ChannelNameEditMode.All; + this.Features.CanSkipChannels = true; + this.Features.CanDeleteChannels = true; + this.Features.CanHaveGaps = true; + this.Features.EncryptedFlagEdit = false; + this.DataRoot.SortedFavorites = false; + this.DataRoot.SupportedFavorites = Favorites.A | Favorites.B | Favorites.C | Favorites.D | Favorites.E; } + #endregion + public override string DisplayName => "ChanSort .csv Reference List Loader"; + #region Load() - public void Load() - { - this.clearedLists.Clear(); - using (var stream = new StreamReader(fileName)) - this.ReadChannelsFromStream(stream); - } - #endregion - #region ReadChannelsFromStream() - - public void ReadChannelsFromStream(TextReader stream) + public override void Load() { - int lineNr = 0; - string line = ""; - try + using (var stream = new StreamReader(this.FileName)) { - while ((line = stream.ReadLine()) != null) + var lineNr = 0; + var line = ""; + try { - ++lineNr; - this.ReadChannel(line); + while ((line = stream.ReadLine()) != null) + this.ReadChannel(line, ++lineNr); + } + catch (Exception ex) + { + throw new FileLoadException($"Error in reference file line #{lineNr}: {line}", ex); } - } - catch (Exception ex) - { - throw new FileLoadException(string.Format("Error in reference file line #{0}: {1}", lineNr, line), ex); } } @@ -59,67 +66,62 @@ namespace ChanSort.Api #region ReadChannel() - private void ReadChannel(string line) + private void ReadChannel(string line, int lineNr) { var parts = CsvFile.Parse(line, ','); if (parts.Count < 5) return; int programNr; if (!int.TryParse(parts[1], out programNr)) return; - string uid = parts[3]; + var uid = parts[3]; if (uid.StartsWith("S")) // remove satellite orbital position from UID ... not all TV models provide this information uid = "S" + uid.Substring(uid.IndexOf('-')); - SignalSource signalSource = GetSignalSource(ref programNr, uid, parts); + var signalSource = GetSignalSource(ref programNr, uid, parts); if (signalSource == 0) return; - string name = parts[4]; - ChannelList channelList = this.GetInitiallyClearedChannelList(signalSource); + var channelList = this.GetChannelList(signalSource); if (channelList == null) return; - IEnumerable channels = FindChannels(channelList, name, uid); - var channel = channels == null ? null : channels.FirstOrDefault(c => c.NewProgramNr == -1); - if (channel != null) + var name = parts[4]; + var channel = new ChannelInfo(signalSource, lineNr, programNr, name); + + var uidParts = uid.Split('-'); + if (uidParts.Length >= 4) { - if (!this.addChannels) - { - channel.NewProgramNr = programNr; - if ((channel.SignalSource & SignalSource.Analog) != 0) - { - channel.Name = name; - channel.IsNameModified = true; - } - if (parts.Count >= 7) - ApplyFlags(channel, parts[6]); - } - } - else if (parts.Count >= 6) // create proxy channel when using the new ref-list format - { - channel = new ChannelInfo(signalSource, uid, programNr, name); - if (addChannels) - { - channel.NewProgramNr = -1; - channel.OldProgramNr = programNr; - } - channelList.AddChannel(channel); + int val; + if (int.TryParse(uidParts[1], out val)) + channel.OriginalNetworkId = val; + if (int.TryParse(uidParts[2], out val)) + channel.TransportStreamId = val; + if (int.TryParse(uidParts[3], out val)) + channel.ServiceId = val; } + + if (parts.Count >= 7) + ApplyFlags(channel, parts[6]); + + this.DataRoot.AddChannel(channelList, channel); } + #endregion #region GetSignalSource() + private static SignalSource GetSignalSource(ref int slot, string uid, IList parts) { // new lists store a bitmask which defines the type of channel and list it came from if (parts.Count >= 6 && parts[5].Length >= 4) { SignalSource s = 0; - string code = parts[5]; + var code = parts[5]; if (code[0] == 'A') s |= SignalSource.Analog; else if (code[0] == 'D') s |= SignalSource.Digital; if (code[1] == 'A') s |= SignalSource.Antenna; else if (code[1] == 'C') s |= SignalSource.Cable; else if (code[1] == 'S') s |= SignalSource.Sat; + else if (code[1] == 'I') s |= SignalSource.IP; if (code[2] == 'T') s |= SignalSource.Tv; else if (code[2] == 'R') s |= SignalSource.Radio; @@ -129,16 +131,25 @@ namespace ChanSort.Api } // compatibility for older lists - bool isTv = slot < 0x4000; + var isTv = slot < 0x4000; slot &= 0x3FFFF; SignalSource signalSource; switch (uid[0]) { - case 'S': signalSource = SignalSource.DvbS; break; - case 'C': signalSource = SignalSource.DvbCT; break; - case 'A': signalSource = SignalSource.AnalogCT; break; - case 'H': signalSource = SignalSource.HdPlusD; break; - default: return 0; + case 'S': + signalSource = SignalSource.DvbS; + break; + case 'C': + signalSource = SignalSource.DvbCT; + break; + case 'A': + signalSource = SignalSource.AnalogCT; + break; + case 'H': + signalSource = SignalSource.HdPlusD; + break; + default: + return 0; } signalSource |= isTv ? SignalSource.Tv : SignalSource.Radio; return signalSource; @@ -146,100 +157,92 @@ namespace ChanSort.Api #endregion - #region GetInitiallyClearedChannelList() - private ChannelList GetInitiallyClearedChannelList(SignalSource signalSource) + #region GetChannelList() + + private ChannelList GetChannelList(SignalSource signalSource) { - var channelList = dataRoot.GetChannelList(signalSource); - if (channelList == null || channelList.ReadOnly) - return null; - if (!this.addChannels && !this.clearedLists.Contains(channelList)) + var channelList = this.DataRoot.GetChannelList(signalSource); + if (channelList == null) { - foreach (var channel in channelList.Channels) - channel.NewProgramNr = -1; - this.clearedLists.Add(channelList); + channelList = new ChannelList(signalSource, CreateCaption(signalSource)); + channelList.VisibleColumnFieldNames = Columns; + this.DataRoot.AddChannelList(channelList); } return channelList; } + #endregion - #region FindChannels() - private IEnumerable FindChannels(ChannelList channelList, string name, string uid) + #region CreateCaption() + + private string CreateCaption(SignalSource signalSource) { - // if there's only a single channel with the given name, use it regardless of UID (allows for a changed freq/tranpsonder) - IList list = channelList.GetChannelByName(name).ToList(); - if (list.Count == 1) - return list; + var sb = new StringBuilder(); + if ((signalSource & SignalSource.DvbT) == SignalSource.DvbT) + sb.Append("DVB-T"); + else if ((signalSource & SignalSource.DvbC) == SignalSource.DvbC) + sb.Append("DVB-C"); + else if ((signalSource & SignalSource.DvbS) == SignalSource.DvbS) + sb.Append("DVB-S"); + else if ((signalSource & SignalSource.IP) == SignalSource.IP) + sb.Append("IP"); + else if ((signalSource & SignalSource.Digital) == SignalSource.Digital) + sb.Append("DVB"); + else if ((signalSource & SignalSource.Analog) == SignalSource.Analog) + sb.Append("Analog"); - string[] uidParts; - if (uid.StartsWith("C") && (uidParts = uid.Split('-')).Length <= 4) - { - // older CSV files didn't use the Transponder as part of the UID, which is necessary - // to distinguish between DVB-T channels with identical (onid,tsid,sid), which may be received - // from multiple regional transmitters on different transponders - int onid = int.Parse(uidParts[1]); - int tsid = int.Parse(uidParts[2]); - int sid = int.Parse(uidParts[3]); - return channelList.Channels.Where(c => - c.OriginalNetworkId == onid && - c.TransportStreamId == tsid && - c.ServiceId == sid - ).ToList(); - } + sb.Append(" "); + if ((signalSource & SignalSource.Tv) == SignalSource.Tv) + sb.Append("TV"); + else if ((signalSource & SignalSource.Radio) == SignalSource.Radio) + sb.Append("Radio"); + else + sb.Append("Data"); - var byUidList = channelList.GetChannelByUid(uid); - return byUidList; + return sb.ToString(); } + #endregion #region ApplyFlags() + private void ApplyFlags(ChannelInfo channel, string flags) { channel.Lock = false; channel.Skip = false; channel.Hidden = false; - foreach (char c in flags) + foreach (var c in flags) { switch (c) { - case '1': channel.Favorites |= Favorites.A; break; - case '2': channel.Favorites |= Favorites.B; break; - case '3': channel.Favorites |= Favorites.C; break; - case '4': channel.Favorites |= Favorites.D; break; - case '5': channel.Favorites |= Favorites.E; break; - case 'L': channel.Lock = true; break; - case 'S': channel.Skip = true; break; - case 'H': channel.Hidden = true; break; - case 'D': channel.IsDeleted = true; break; - } - } - } - #endregion - - #region Save() - public void Save() - { - using (StreamWriter stream = new StreamWriter(fileName)) - { - Save(stream); - } - } - - public void Save(StreamWriter stream) - { - foreach (var channelList in dataRoot.ChannelLists) - { - foreach (var channel in channelList.Channels.Where(ch => ch.NewProgramNr != -1).OrderBy(ch => ch.NewProgramNr)) - { - string line = string.Format("{0},{1},{2},{3},\"{4}\",{5},{6}", - "", // past: channel.RecordIndex, - channel.NewProgramNr, - "", // past: channel.TransportStreamId, - channel.Uid, - channel.Name, - this.EncodeSignalSource(channel.SignalSource), - this.EncodeFavoritesAndFlags(channel)); - stream.WriteLine(line); + case '1': + channel.Favorites |= Favorites.A; + break; + case '2': + channel.Favorites |= Favorites.B; + break; + case '3': + channel.Favorites |= Favorites.C; + break; + case '4': + channel.Favorites |= Favorites.D; + break; + case '5': + channel.Favorites |= Favorites.E; + break; + case 'L': + channel.Lock = true; + break; + case 'S': + channel.Skip = true; + break; + case 'H': + channel.Hidden = true; + break; + case 'D': + channel.IsDeleted = true; + break; } } } @@ -247,28 +250,32 @@ namespace ChanSort.Api #endregion #region EncodeSignalSource() - private object EncodeSignalSource(SignalSource signalSource) + + private static string EncodeSignalSource(SignalSource signalSource) { - StringBuilder sb = new StringBuilder(); + var sb = new StringBuilder(); if ((signalSource & SignalSource.Analog) != 0) sb.Append('A'); else sb.Append('D'); if ((signalSource & SignalSource.Antenna) != 0) sb.Append('A'); else if ((signalSource & SignalSource.Cable) != 0) sb.Append('C'); - else sb.Append('S'); + else if ((signalSource & SignalSource.Sat) != 0) sb.Append('S'); + else sb.Append("I"); if ((signalSource & SignalSource.Radio) != 0) sb.Append('R'); else sb.Append('T'); - sb.Append((int)signalSource >> 12); + sb.Append((int) signalSource >> 12); return sb.ToString(); } + #endregion #region EncodeFavoritesAndFlags() - private string EncodeFavoritesAndFlags(ChannelInfo channel) + + private static string EncodeFavoritesAndFlags(ChannelInfo channel) { - StringBuilder sb = new StringBuilder(); + var sb = new StringBuilder(); if ((channel.Favorites & Favorites.A) != 0) sb.Append('1'); if ((channel.Favorites & Favorites.B) != 0) sb.Append('2'); if ((channel.Favorites & Favorites.C) != 0) sb.Append('3'); @@ -282,5 +289,47 @@ namespace ChanSort.Api } #endregion + + #region Save() + + public override void Save(string tvDataFile) + { + Save(tvDataFile, this.DataRoot); + this.FileName = tvDataFile; + } + + public static void Save(string tvDataFile, DataRoot dataRoot) + { + using (var stream = new StreamWriter(tvDataFile)) + { + Save(stream, dataRoot); + } + } + + public static void Save(StreamWriter stream, DataRoot dataRoot) + { + foreach (var channelList in dataRoot.ChannelLists) + { + if (channelList.IsMixedSourceFavoritesList) // these pseudo-lists would create dupes for all channels + continue; + + foreach (var channel in channelList.GetChannelsByNewOrder()) + { + if (channel.NewProgramNr == -1) + continue; + var line = string.Format("{0},{1},{2},{3},\"{4}\",{5},{6}", + "", // past: channel.RecordIndex, + channel.NewProgramNr, + "", // past: channel.TransportStreamId, + channel.Uid, + channel.Name, + EncodeSignalSource(channel.SignalSource), + EncodeFavoritesAndFlags(channel)); + stream.WriteLine(line); + } + } + } + + #endregion } -} +} \ No newline at end of file diff --git a/source/ChanSort.Loader.RefList/RefSerializer.cs b/source/ChanSort.Api/Controller/RefSerializer.cs similarity index 93% rename from source/ChanSort.Loader.RefList/RefSerializer.cs rename to source/ChanSort.Api/Controller/RefSerializer.cs index 5cb5d2e..8b47733 100644 --- a/source/ChanSort.Loader.RefList/RefSerializer.cs +++ b/source/ChanSort.Api/Controller/RefSerializer.cs @@ -1,9 +1,8 @@ using System.Collections.Generic; using System.IO; using System.Text; -using ChanSort.Api; -namespace ChanSort.Loader.RefList +namespace ChanSort.Api { public class RefSerializer : SerializerBase { @@ -90,6 +89,7 @@ namespace ChanSort.Loader.RefList #endregion + #region GetFileInformation() public override string GetFileInformation() @@ -102,14 +102,7 @@ namespace ChanSort.Loader.RefList #endregion #region Save() - - //public override void Save(string tvOutputFile) - //{ - // var writer = new ChlFileSerializer(); - // writer.Save(tvOutputFile, this.allChannels); - // this.FileName = tvOutputFile; - //} - + public override void Save(string tvOutputFile) { Save(tvOutputFile, this.allChannels); diff --git a/source/ChanSort.Api/Controller/RefSerializerPlugin.cs b/source/ChanSort.Api/Controller/RefSerializerPlugin.cs new file mode 100644 index 0000000..f8447c9 --- /dev/null +++ b/source/ChanSort.Api/Controller/RefSerializerPlugin.cs @@ -0,0 +1,20 @@ +using System.IO; + +namespace ChanSort.Api +{ + public class RefSerializerPlugin : ISerializerPlugin + { + public string PluginName => "ChanSort Reference List"; + + public string FileFilter => "*.txt;*.chl;*.csv"; + + public SerializerBase CreateSerializer(string inputFile) + { + var ext = (Path.GetExtension(inputFile) ?? "").ToLower(); + if (ext == ".csv") + return new CsvFileSerializer(inputFile); + else + return new RefSerializer(inputFile); + } + } +} diff --git a/source/ChanSort.Api/Controller/SerializerBase.cs b/source/ChanSort.Api/Controller/SerializerBase.cs index 5b9f0dc..bb0eb4c 100644 --- a/source/ChanSort.Api/Controller/SerializerBase.cs +++ b/source/ChanSort.Api/Controller/SerializerBase.cs @@ -4,6 +4,8 @@ namespace ChanSort.Api { public abstract class SerializerBase { + #region class SupportedFeatures + public class SupportedFeatures { public ChannelNameEditMode ChannelNameEdit { get; set; } @@ -20,6 +22,7 @@ namespace ChanSort.Api this.CanHaveGaps = true; } } + #endregion private Encoding defaultEncoding; diff --git a/source/ChanSort.Loader.RefList/ChanSort.Loader.RefList.csproj b/source/ChanSort.Loader.RefList/ChanSort.Loader.RefList.csproj index 9641c97..2990928 100644 --- a/source/ChanSort.Loader.RefList/ChanSort.Loader.RefList.csproj +++ b/source/ChanSort.Loader.RefList/ChanSort.Loader.RefList.csproj @@ -60,8 +60,6 @@ - - diff --git a/source/ChanSort.Loader.RefList/RefSerializerPlugin.cs b/source/ChanSort.Loader.RefList/RefSerializerPlugin.cs deleted file mode 100644 index ca7215a..0000000 --- a/source/ChanSort.Loader.RefList/RefSerializerPlugin.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ChanSort.Api; - -namespace ChanSort.Loader.RefList -{ - public class RefSerializerPlugin : ISerializerPlugin - { - public string PluginName => "ChanSort Reference List"; - - public string FileFilter => "*.txt;*.chl"; - - public SerializerBase CreateSerializer(string inputFile) - { - return new RefSerializer(inputFile); - } - } -} diff --git a/source/ChanSort.sln b/source/ChanSort.sln index 59f74bc..0df77eb 100644 --- a/source/ChanSort.sln +++ b/source/ChanSort.sln @@ -6,7 +6,6 @@ MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChanSort", "ChanSort\ChanSort.csproj", "{5FAFDABC-A52F-498C-BD2F-AFFC4119797A}" ProjectSection(ProjectDependencies) = postProject {33897002-0537-49A4-B963-A18D17311B3D} = {33897002-0537-49A4-B963-A18D17311B3D} - {A2A5C606-167C-4FC2-87A8-2D67590B283B} = {A2A5C606-167C-4FC2-87A8-2D67590B283B} {74A18C6F-09FF-413E-90D9-827066FA5B36} = {74A18C6F-09FF-413E-90D9-827066FA5B36} {68DA8072-3A29-4076-9F64-D66F38349585} = {68DA8072-3A29-4076-9F64-D66F38349585} {A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5} = {A1C9A98D-368A-44E8-9B7F-7EACA46C9EC5} @@ -46,8 +45,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChanSort.Loader.Hisense", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.Loader.Samsung", "Test.Loader.Samsung\Test.Loader.Samsung.csproj", "{1ED68A9B-6698-4609-B9E6-8E08B6055F2E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChanSort.Loader.RefList", "ChanSort.Loader.RefList\ChanSort.Loader.RefList.csproj", "{A2A5C606-167C-4FC2-87A8-2D67590B283B}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -206,18 +203,6 @@ Global {1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|Mixed Platforms.Build.0 = Release|Any CPU {1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|x86.ActiveCfg = Release|Any CPU {1ED68A9B-6698-4609-B9E6-8E08B6055F2E}.Release|x86.Build.0 = Release|Any CPU - {A2A5C606-167C-4FC2-87A8-2D67590B283B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A2A5C606-167C-4FC2-87A8-2D67590B283B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A2A5C606-167C-4FC2-87A8-2D67590B283B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {A2A5C606-167C-4FC2-87A8-2D67590B283B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {A2A5C606-167C-4FC2-87A8-2D67590B283B}.Debug|x86.ActiveCfg = Debug|x86 - {A2A5C606-167C-4FC2-87A8-2D67590B283B}.Debug|x86.Build.0 = Debug|x86 - {A2A5C606-167C-4FC2-87A8-2D67590B283B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A2A5C606-167C-4FC2-87A8-2D67590B283B}.Release|Any CPU.Build.0 = Release|Any CPU - {A2A5C606-167C-4FC2-87A8-2D67590B283B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {A2A5C606-167C-4FC2-87A8-2D67590B283B}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {A2A5C606-167C-4FC2-87A8-2D67590B283B}.Release|x86.ActiveCfg = Release|Any CPU - {A2A5C606-167C-4FC2-87A8-2D67590B283B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/source/ChanSort/ChanSort.csproj b/source/ChanSort/ChanSort.csproj index d317df2..ea7b2ee 100644 --- a/source/ChanSort/ChanSort.csproj +++ b/source/ChanSort/ChanSort.csproj @@ -306,10 +306,6 @@ {DCCFFA08-472B-4D17-BB90-8F513FC01392} ChanSort.Api - - {a2a5c606-167c-4fc2-87a8-2d67590b283b} - ChanSort.Loader.RefList - diff --git a/source/ChanSort/MainForm.cs b/source/ChanSort/MainForm.cs index 61fe741..2fa2419 100644 --- a/source/ChanSort/MainForm.cs +++ b/source/ChanSort/MainForm.cs @@ -1,16 +1,21 @@ //#define ADD_CHANNELS_FROM_REF_LIST + using System; using System.Collections.Generic; +using System.ComponentModel; using System.Drawing; using System.Globalization; using System.IO; +using System.Linq; using System.Reflection; using System.Text; +using System.Text.RegularExpressions; using System.Threading; -using System.Linq; using System.Windows.Forms; using ChanSort.Api; +using ChanSort.Ui.Printing; using ChanSort.Ui.Properties; +using DevExpress.Data; using DevExpress.Utils; using DevExpress.XtraBars; using DevExpress.XtraEditors; @@ -19,6 +24,7 @@ using DevExpress.XtraGrid; using DevExpress.XtraGrid.Columns; using DevExpress.XtraGrid.Views.Base; using DevExpress.XtraGrid.Views.Grid; +using DevExpress.XtraGrid.Views.Grid.ViewInfo; using DevExpress.XtraTab; namespace ChanSort.Ui @@ -28,57 +34,25 @@ namespace ChanSort.Ui public const string AppVersion = "v2016-04-19"; private const int MaxMruEntries = 10; - - #region enum EditMode - private enum EditMode - { - InsertBefore = 0, - InsertAfter = 1, - Swap = 2 - } - #endregion - - #region class DragDropInfo - private class DragDropInfo - { - public readonly GridView SourceView; - public readonly int SourcePosition; - public EditMode EditMode; - public int DropRowHandle = -1; - - public DragDropInfo(GridView source, int sourcePosition) - { - this.SourceView = source; - this.SourcePosition = sourcePosition; - } - } - #endregion - - private readonly IList plugins; - private string currentTvFile; - private string currentRefFile; - private ISerializerPlugin currentPlugin; - private SerializerBase currentTvSerializer; - private Editor editor; - private DataRoot dataRoot; - private bool ignoreLanguageChange; - private readonly string title; - private Encoding defaultEncoding = Encoding.Default; private readonly List isoEncodings = new List(); - private ChannelList currentChannelList; - private int subListIndex; - private GridView lastFocusedGrid; - private EditMode curEditMode = EditMode.InsertAfter; - private bool dontOpenEditor; private readonly List mruFiles = new List(); - private DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo downHit; + + private readonly string title; + private EditMode curEditMode = EditMode.InsertAfter; + private ISerializerPlugin currentPlugin; + private string currentRefFile; + private string currentTvFile; + private SerializerBase currentTvSerializer; + private Encoding defaultEncoding = Encoding.Default; + private bool dontOpenEditor; + private GridHitInfo downHit; private DragDropInfo dragDropInfo; - internal IList Plugins => plugins; - internal DataRoot DataRoot => dataRoot; - internal Editor Editor => editor; - internal ChannelList CurrentChannelList => currentChannelList; + private bool ignoreLanguageChange; + private GridView lastFocusedGrid; + private int subListIndex; #region ctor() + public MainForm() { if (!string.IsNullOrEmpty(Settings.Default.Language)) @@ -90,7 +64,7 @@ namespace ChanSort.Ui this.Size = Settings.Default.WindowSize; this.title = string.Format(base.Text, AppVersion); base.Text = title; - this.plugins = this.LoadSerializerPlugins(); + this.Plugins = this.LoadSerializerPlugins(); this.FillMenuWithIsoEncodings(); using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ChanSort.Ui.app.ico")) @@ -111,45 +85,76 @@ namespace ChanSort.Ui this.miAddFromRefList.Enabled = false; #endif } + + #endregion + + internal IList Plugins { get; } + + internal DataRoot DataRoot { get; private set; } + + internal Editor Editor { get; private set; } + + internal ChannelList CurrentChannelList { get; private set; } + + #region IsLeftGridSortedByNewProgNr + + private bool IsLeftGridSortedByNewProgNr + { + get + { + return this.gviewLeft.SortedColumns.Count >= 1 && + this.gviewLeft.SortedColumns[0].FieldName == this.colOutSlot.FieldName; + } + } + #endregion #region InitAppAfterMainWindowWasShown() + private void InitAppAfterMainWindowWasShown() { - this.BeginInvoke((Action)UpdateCheck.CheckForNewVersion); + this.BeginInvoke((Action) UpdateCheck.CheckForNewVersion); } + #endregion #region LoadSerializerPlugins() + private IList LoadSerializerPlugins() { var list = new List(); - string exeDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? ""; + list.Add(new RefSerializerPlugin()); + var exeDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? ""; foreach (var file in Directory.GetFiles(exeDir, "ChanSort.Loader.*.dll")) { try { var assembly = Assembly.UnsafeLoadFrom(file); - foreach(var type in assembly.GetTypes()) + foreach (var type in assembly.GetTypes()) { - if (typeof(ISerializerPlugin).IsAssignableFrom(type) && !type.IsAbstract) + if (typeof (ISerializerPlugin).IsAssignableFrom(type) && !type.IsAbstract) list.Add((ISerializerPlugin) Activator.CreateInstance(type)); } } - catch(Exception ex) { HandleException(new IOException("Plugin " + file + "\n" + ex.Message, ex)); } + catch (Exception ex) + { + HandleException(new IOException("Plugin " + file + "\n" + ex.Message, ex)); + } } return list; } + #endregion #region ShowOpenFileDialog() + private void ShowOpenFileDialog() { string supportedExtensions; int numberOfFilters; var filter = GetTvDataFileFilter(out supportedExtensions, out numberOfFilters); - using (OpenFileDialog dlg = new OpenFileDialog()) + using (var dlg = new OpenFileDialog()) { dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer); dlg.AddExtension = true; @@ -160,19 +165,21 @@ namespace ChanSort.Ui if (dlg.ShowDialog() != DialogResult.OK) return; - var plugin = dlg.FilterIndex <= this.plugins.Count ? this.plugins[dlg.FilterIndex - 1] : null; - this.LoadFiles(plugin, dlg.FileName); + var plugin = dlg.FilterIndex <= this.Plugins.Count ? this.Plugins[dlg.FilterIndex - 1] : null; + this.LoadFiles(plugin, dlg.FileName); } } + #endregion #region GetTvDataFileFilter() + internal string GetTvDataFileFilter(out string supportedExtensions, out int numberOfFilters) { numberOfFilters = 0; - StringBuilder filter = new StringBuilder(); + var filter = new StringBuilder(); var extension = new StringBuilder(); - foreach (var plugin in this.plugins) + foreach (var plugin in this.Plugins) { filter.Append(plugin.PluginName).Append("|").Append(plugin.FileFilter); extension.Append(plugin.FileFilter); @@ -189,6 +196,7 @@ namespace ChanSort.Ui #endregion #region SetFileName() + private void SetFileName(string tvDataFile) { this.currentTvFile = tvDataFile; @@ -199,22 +207,25 @@ namespace ChanSort.Ui } this.Text = this.title + " - " + Path.GetFileName(this.currentTvFile); } + #endregion #region ReLoadFiles() + private void ReLoadFiles(ISerializerPlugin plugin) { - int listIndex = this.tabChannelList.SelectedTabPageIndex; + var listIndex = this.tabChannelList.SelectedTabPageIndex; this.LoadFiles(plugin, this.currentTvFile); this.tabChannelList.SelectedTabPageIndex = listIndex; } + #endregion #region LoadFiles() private void LoadFiles(ISerializerPlugin plugin, string tvDataFile) { - bool dataUpdated = false; + var dataUpdated = false; try { if (DetectCommonFileCorruptions(tvDataFile)) @@ -227,31 +238,31 @@ namespace ChanSort.Ui this.gviewRight.BeginDataUpdate(); this.gviewLeft.BeginDataUpdate(); - this.editor = new Editor(); - this.editor.DataRoot = this.dataRoot; + this.Editor = new Editor(); + this.Editor.DataRoot = this.DataRoot; - this.currentChannelList = null; - this.editor.ChannelList = null; + this.CurrentChannelList = null; + this.Editor.ChannelList = null; this.gridRight.DataSource = null; this.gridLeft.DataSource = null; this.FillChannelListCombo(); //this.SetControlsEnabled(!this.dataRoot.IsEmpty); - this.UpdateFavoritesEditor(this.dataRoot.SupportedFavorites); + this.UpdateFavoritesEditor(this.DataRoot.SupportedFavorites); this.colEncrypted.OptionsColumn.AllowEdit = this.currentTvSerializer.Features.EncryptedFlagEdit; - if (this.dataRoot.Warnings.Length > 0 && this.miShowWarningsAfterLoad.Checked) - this.BeginInvoke((Action)this.ShowFileInformation); + if (this.DataRoot.Warnings.Length > 0 && this.miShowWarningsAfterLoad.Checked) + this.BeginInvoke((Action) this.ShowFileInformation); - this.BeginInvoke((Action)this.InitInitialChannelOrder); + this.BeginInvoke((Action) this.InitInitialChannelOrder); } catch (Exception ex) { if (!(ex is IOException)) throw; - string name = plugin != null ? plugin.PluginName : "Loader"; + var name = plugin != null ? plugin.PluginName : "Loader"; XtraMessageBox.Show(this, name + "\n\n" + ex.Message, Resources.MainForm_LoadFiles_IOException, - MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBoxButtons.OK, MessageBoxIcon.Error); this.currentPlugin = null; this.currentTvFile = null; this.currentTvSerializer = null; @@ -266,13 +277,15 @@ namespace ChanSort.Ui } } } + #endregion #region DetectCommonFileCorruptions() + internal bool DetectCommonFileCorruptions(string tvDataFile) { var content = File.ReadAllBytes(tvDataFile); - bool isAllZero = true; + var isAllZero = true; for (int i = 0, c = content.Length; i < c; i++) { if (content[i] != 0) @@ -295,14 +308,15 @@ namespace ChanSort.Ui #endregion #region FillChannelListCombo() + private void FillChannelListCombo() { this.tabChannelList.TabPages.Clear(); - + var itemList = new List(); - foreach(BarItemLink link in this.mnuInputSource.ItemLinks) + foreach (BarItemLink link in this.mnuInputSource.ItemLinks) itemList.Add(link.Item); - foreach (BarItem item in itemList) + foreach (var item in itemList) { this.barManager1.Items.Remove(item); item.Dispose(); @@ -310,8 +324,8 @@ namespace ChanSort.Ui this.mnuInputSource.ClearLinks(); XtraTabPage firstNonEmpty = null; - int i = 0; - foreach (var list in this.dataRoot.ChannelLists) + var i = 0; + foreach (var list in this.DataRoot.ChannelLists) { if (list.Channels.Count == 0) continue; @@ -320,7 +334,7 @@ namespace ChanSort.Ui if (firstNonEmpty == null && list.Count > 0) firstNonEmpty = tab; var item = new BarButtonItem(this.barManager1, list.Caption); - item.ItemShortcut = new BarShortcut((Keys) ((int)(Keys.Alt | Keys.D1) + i)); + item.ItemShortcut = new BarShortcut((Keys) ((int) (Keys.Alt | Keys.D1) + i)); item.Tag = i; item.ItemClick += this.miInputSource_ItemClick; this.mnuInputSource.AddItem(item); @@ -332,32 +346,33 @@ namespace ChanSort.Ui if (firstNonEmpty == null) firstNonEmpty = tabChannelList.TabPages[0]; if (firstNonEmpty == this.tabChannelList.SelectedTabPage) - this.ShowChannelList((ChannelList)firstNonEmpty.Tag); + this.ShowChannelList((ChannelList) firstNonEmpty.Tag); else this.tabChannelList.SelectedTabPage = firstNonEmpty; } else { this.tabChannelList.TabPages.Add(this.pageEmpty); - this.currentChannelList = null; + this.CurrentChannelList = null; } } #endregion #region UpdateFavoritesEditor() + private void UpdateFavoritesEditor(Favorites favorites) { this.repositoryItemCheckedComboBoxEdit1.Items.Clear(); this.repositoryItemCheckedComboBoxEdit2.Items.Clear(); byte mask = 0x01; - string regex = "["; - int favCount = 0; - for (int bit=0; bit<5; bit++, mask<<=1) + var regex = "["; + var favCount = 0; + for (var bit = 0; bit < 5; bit++, mask <<= 1) { if (((int) favorites & mask) != 0) { - char c = (char) ('A' + bit); + var c = (char) ('A' + bit); this.repositoryItemCheckedComboBoxEdit1.Items.Add(c); this.repositoryItemCheckedComboBoxEdit2.Items.Add(c); regex += c; @@ -369,55 +384,58 @@ namespace ChanSort.Ui this.repositoryItemCheckedComboBoxEdit2.Mask.EditMask = regex; while (this.tabSubList.TabPages.Count > favCount + 1) - this.tabSubList.TabPages.RemoveAt(this.tabSubList.TabPages.Count-1); + this.tabSubList.TabPages.RemoveAt(this.tabSubList.TabPages.Count - 1); while (this.tabSubList.TabPages.Count < favCount + 1) { var page = this.tabSubList.TabPages.Add(); - page.Text = "Fav " + (char)('A' + this.tabSubList.TabPages.Count - 2); + page.Text = "Fav " + (char) ('A' + this.tabSubList.TabPages.Count - 2); } - if (!this.dataRoot.SortedFavorites || this.subListIndex >= favCount) + if (!this.DataRoot.SortedFavorites || this.subListIndex >= favCount) { this.tabSubList.SelectedTabPageIndex = 0; this.subListIndex = 0; } - this.colOutFav.OptionsColumn.AllowEdit = !this.dataRoot.SortedFavorites; - this.colFavorites.OptionsColumn.AllowEdit = !this.dataRoot.SortedFavorites; + this.colOutFav.OptionsColumn.AllowEdit = !this.DataRoot.SortedFavorites; + this.colFavorites.OptionsColumn.AllowEdit = !this.DataRoot.SortedFavorites; } #endregion #region GetTvFileSerializer() + internal ISerializerPlugin GetPluginForFile(string inputFileName) { if (!File.Exists(inputFileName)) { - XtraMessageBox.Show(this, String.Format(Resources.MainForm_LoadTll_SourceTllNotFound, inputFileName)); + XtraMessageBox.Show(this, string.Format(Resources.MainForm_LoadTll_SourceTllNotFound, inputFileName)); return null; } - string upperFileName = (Path.GetFileName(inputFileName) ??"").ToUpper(); - foreach (var plugin in this.plugins) + var upperFileName = (Path.GetFileName(inputFileName) ?? "").ToUpper(); + foreach (var plugin in this.Plugins) { foreach (var filter in plugin.FileFilter.ToUpper().Split(';')) { var regex = filter.Replace(".", "\\.").Replace("*", ".*").Replace("?", "."); - if (System.Text.RegularExpressions.Regex.IsMatch(upperFileName, regex)) + if (Regex.IsMatch(upperFileName, regex)) return plugin; } } - XtraMessageBox.Show(this, String.Format(Resources.MainForm_LoadTll_SerializerNotFound, inputFileName)); + XtraMessageBox.Show(this, string.Format(Resources.MainForm_LoadTll_SerializerNotFound, inputFileName)); return null; } + #endregion #region LoadTvDataFile() + private bool LoadTvDataFile(ISerializerPlugin plugin, string tvDataFile) { if (!File.Exists(tvDataFile)) { - XtraMessageBox.Show(this, Resources.MainForm_LoadTvDataFile_FileNotFound_Caption, + XtraMessageBox.Show(this, Resources.MainForm_LoadTvDataFile_FileNotFound_Caption, string.Format(Resources.MainForm_LoadTvDataFile_FileNotFound_Message, tvDataFile), - MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return false; } @@ -434,56 +452,66 @@ namespace ChanSort.Ui serializer.DefaultEncoding = this.defaultEncoding; serializer.Load(); this.SetFileName(tvDataFile); - this.currentPlugin = plugin; + this.currentPlugin = plugin; this.currentTvSerializer = serializer; - this.dataRoot = this.currentTvSerializer.DataRoot; + this.DataRoot = this.currentTvSerializer.DataRoot; this.AddFileToMruList(this.currentTvFile); this.UpdateMruMenu(); return true; } + #endregion #region AddFileToMruList() + private void AddFileToMruList(string file) { - if (string.IsNullOrEmpty(file)) - return; + if (string.IsNullOrEmpty(file)) + return; this.mruFiles.Remove(file); if (this.mruFiles.Count >= MaxMruEntries) - this.mruFiles.RemoveAt(this.mruFiles.Count-1); + this.mruFiles.RemoveAt(this.mruFiles.Count - 1); this.mruFiles.Insert(0, file); } + #endregion #region PromptSaveAndContinue() + private bool PromptSaveAndContinue() { - if (this.dataRoot == null || !this.dataRoot.NeedsSaving) + if (this.DataRoot == null || !this.DataRoot.NeedsSaving) return true; - using (ActionBoxDialog dlg = new ActionBoxDialog(Resources.MainForm_PromptSaveAndContinue_Question)) + using (var dlg = new ActionBoxDialog(Resources.MainForm_PromptSaveAndContinue_Question)) { dlg.AddAction(Resources.MainForm_PromptSaveAndContinue_Save, DialogResult.Yes, dlg.Save); dlg.AddAction(Resources.MainForm_PromptSaveAndContinue_Discard, DialogResult.No, dlg.Discard); dlg.AddAction(Resources.MainForm_Cancel, DialogResult.Cancel, dlg.Cancel); switch (dlg.ShowDialog(this)) { - case DialogResult.Yes: this.SaveFiles(); break; - case DialogResult.No: break; - case DialogResult.Cancel: return false; + case DialogResult.Yes: + this.SaveFiles(); + break; + case DialogResult.No: + break; + case DialogResult.Cancel: + return false; } } return true; } + #endregion #region InitInitialChannelOrder() + private void InitInitialChannelOrder() { DialogResult res; - string msg = Resources.MainForm_InitInitialChannelOrder_Question; - using (ActionBoxDialog dlg = new ActionBoxDialog(msg)) + var msg = Resources.MainForm_InitInitialChannelOrder_Question; + using (var dlg = new ActionBoxDialog(msg)) { dlg.AddAction(Resources.MainForm_InitInitialChannelOrder_EmptyList, DialogResult.Cancel, dlg.EmptyList); dlg.AddAction(Resources.MainForm_InitInitialChannelOrder_CurrentList, DialogResult.No, dlg.FullList, true); @@ -492,16 +520,18 @@ namespace ChanSort.Ui } if (res == DialogResult.Yes) - this.BeginInvoke((Action)(()=>this.ShowOpenReferenceFileDialog(false))); + this.BeginInvoke((Action) (() => this.ShowOpenReferenceFileDialog(false))); else if (res == DialogResult.No) { - this.dataRoot.ApplyCurrentProgramNumbers(); + this.DataRoot.ApplyCurrentProgramNumbers(); this.RefreshGrid(this.gviewLeft, this.gviewRight); } } + #endregion #region ShowOpenReferenceFileDialog() + private void ShowOpenReferenceFileDialog(bool addChannels) { #if false @@ -546,66 +576,18 @@ namespace ChanSort.Ui new ReferenceListForm(this).ShowDialog(this); #endif } + #endregion - #region LoadReferenceFile() - private void LoadReferenceFile(string fileName, bool addChannels) - { - this.gviewRight.BeginDataUpdate(); - this.gviewLeft.BeginDataUpdate(); + #region ShowChannelList() - string ext = (Path.GetExtension(fileName) ?? "").ToLower(); - if (ext == ".csv") - { - var csvSerializer = new CsvFileSerializer(fileName, this.dataRoot, addChannels); - csvSerializer.Load(); - } - //else if (ext == ".chl" || ext == ".txt") - //{ - // ChlFileSerializer loader = new ChlFileSerializer(); - // string warnings = loader.Load(fileName, this.dataRoot, this.currentChannelList); - // InfoBox.Show(this, warnings, Path.GetFileName(fileName)); - //} - else - { - var plugin = this.GetPluginForFile(fileName); - if (plugin == null) - { - XtraMessageBox.Show(this, "Unsupported type of file"); - } - else - { - var refFile = plugin.CreateSerializer(fileName); - refFile.Load(); - editor.ApplyReferenceList(refFile.DataRoot); - } - } - - this.gviewRight.EndDataUpdate(); - this.gviewLeft.EndDataUpdate(); - } - -#endregion - -#region IsLeftGridSortedByNewProgNr - private bool IsLeftGridSortedByNewProgNr - { - get - { - return this.gviewLeft.SortedColumns.Count >= 1 && - this.gviewLeft.SortedColumns[0].FieldName == this.colOutSlot.FieldName; - } - } -#endregion - -#region ShowChannelList() private void ShowChannelList(ChannelList channelList) { - if (this.currentChannelList != null) - this.SaveInputGridLayout(this.currentChannelList.SignalSource); + if (this.CurrentChannelList != null) + this.SaveInputGridLayout(this.CurrentChannelList.SignalSource); - this.currentChannelList = channelList; - this.editor.ChannelList = channelList; + this.CurrentChannelList = channelList; + this.Editor.ChannelList = channelList; if (channelList != null) { @@ -620,7 +602,7 @@ namespace ChanSort.Ui src |= SignalSource.Digital; this.colName.OptionsColumn.AllowEdit = this.colOutName.OptionsColumn.AllowEdit = (channelList.SignalSource & src) != 0; - if (this.dataRoot.MixedSourceFavorites) + if (this.DataRoot.MixedSourceFavorites) { if (channelList.IsMixedSourceFavoritesList) { @@ -633,14 +615,14 @@ namespace ChanSort.Ui this.grpSubList.Visible = false; this.pageProgNr.PageVisible = true; this.tabSubList.SelectedTabPageIndex = 0; - } + } } else { this.pageProgNr.PageVisible = true; - this.grpSubList.Visible = dataRoot.SortedFavorites; + this.grpSubList.Visible = DataRoot.SortedFavorites; } - + //this.tabSubList.TabPages[0].PageVisible = !channelList.IsMixedSourceFavoritesList; //this.pageProgNr.Enabled = this.pageProgNr.Visible; } @@ -667,13 +649,15 @@ namespace ChanSort.Ui if (!this.grpSubList.Visible) this.tabSubList.SelectedTabPageIndex = 0; } -#endregion -#region UpdateGridReadOnly + #endregion + + #region UpdateGridReadOnly + private void UpdateGridReadOnly() { - bool allowEdit = !this.currentChannelList?.ReadOnly ?? true; - bool forceEdit = this.miAllowEditPredefinedLists.Down; + var allowEdit = !this.CurrentChannelList?.ReadOnly ?? true; + var forceEdit = this.miAllowEditPredefinedLists.Down; this.gviewLeft.OptionsBehavior.Editable = allowEdit || forceEdit; this.gviewRight.OptionsBehavior.Editable = allowEdit || forceEdit; @@ -684,14 +668,14 @@ namespace ChanSort.Ui this.lblPredefinedList.Visible = !(allowEdit || forceEdit); } -#endregion + #endregion -#region ShowSaveFileDialog() + #region ShowSaveFileDialog() private void ShowSaveFileDialog() { - string extension = Path.GetExtension(this.currentTvSerializer.FileName) ?? "."; - using (SaveFileDialog dlg = new SaveFileDialog()) + var extension = Path.GetExtension(this.currentTvSerializer.FileName) ?? "."; + using (var dlg = new SaveFileDialog()) { dlg.InitialDirectory = Path.GetDirectoryName(this.currentTvFile); dlg.FileName = Path.GetFileName(this.currentTvFile); @@ -710,9 +694,9 @@ namespace ChanSort.Ui } } -#endregion + #endregion -#region SaveFiles() + #region SaveFiles() private void SaveFiles() { @@ -726,27 +710,28 @@ namespace ChanSort.Ui if (!this.HandleChannelNumberGaps()) return; this.SaveTvDataFile(); - this.dataRoot.NeedsSaving = false; + this.DataRoot.NeedsSaving = false; this.RefreshGrid(this.gviewLeft, this.gviewRight); this.UpdateMenu(); } catch (IOException ex) { - XtraMessageBox.Show(this, + XtraMessageBox.Show(this, Resources.MainForm_SaveFiles_ErrorMsg + - ex.Message, - Resources.MainForm_SaveFiles_ErrorTitle, + ex.Message, + Resources.MainForm_SaveFiles_ErrorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); } } -#endregion + #endregion + + #region PromptHandlingOfUnsortedChannels() -#region PromptHandlingOfUnsortedChannels() private bool PromptHandlingOfUnsortedChannels() { - bool hasUnsorted = false; - foreach (var list in this.dataRoot.ChannelLists) + var hasUnsorted = false; + foreach (var list in this.DataRoot.ChannelLists) { foreach (var channel in list.Channels) { @@ -774,23 +759,25 @@ namespace ChanSort.Ui if (res == DialogResult.Cancel) return false; - this.editor.AutoNumberingForUnassignedChannels( - res == DialogResult.Yes ? UnsortedChannelMode.AppendInOrder : UnsortedChannelMode.MarkDeleted); + this.Editor.AutoNumberingForUnassignedChannels( + res == DialogResult.Yes ? UnsortedChannelMode.AppendInOrder : UnsortedChannelMode.MarkDeleted); return true; } -#endregion -#region HandleChannelNumberGaps() + #endregion + + #region HandleChannelNumberGaps() + private bool HandleChannelNumberGaps() { if (this.currentTvSerializer.Features.CanHaveGaps) return true; - bool hasGaps = this.ProcessChannelNumberGaps(true); + var hasGaps = this.ProcessChannelNumberGaps(true); if (hasGaps) { var action = XtraMessageBox.Show(this, - Resources.MainForm_HandleChannelNumberGaps, + Resources.MainForm_HandleChannelNumberGaps, "ChanSort", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (action == DialogResult.Cancel) return false; @@ -799,15 +786,17 @@ namespace ChanSort.Ui } return true; } -#endregion -#region ProcessChannelNumberGaps() + #endregion + + #region ProcessChannelNumberGaps() + private bool ProcessChannelNumberGaps(bool testOnly) { - bool wasRenumbered = false; - foreach (var list in this.dataRoot.ChannelLists) + var wasRenumbered = false; + foreach (var list in this.DataRoot.ChannelLists) { - int chNr = 1; + var chNr = 1; foreach (var channel in list.Channels.OrderBy(c => c.NewProgramNr)) { if (channel.IsDeleted || channel.NewProgramNr < 0) @@ -826,9 +815,10 @@ namespace ChanSort.Ui } return wasRenumbered; } -#endregion -#region SaveReferenceFile() + #endregion + + #region SaveReferenceFile() private void SaveReferenceFile() { @@ -849,16 +839,16 @@ namespace ChanSort.Ui fileName = dlg.FileName; } - string ext = (Path.GetExtension(fileName)??"").ToLower(); + var ext = (Path.GetExtension(fileName) ?? "").ToLower(); if (ext == ".csv") - new CsvFileSerializer(fileName, this.dataRoot, false).Save(); + CsvFileSerializer.Save(fileName, this.DataRoot); else if (ext == ".chl" || ext == ".txt") - Loader.RefList.RefSerializer.Save(fileName, this.currentChannelList); + RefSerializer.Save(fileName, this.CurrentChannelList); } -#endregion + #endregion -#region SaveTvDataFile() + #region SaveTvDataFile() private void SaveTvDataFile() { @@ -868,14 +858,14 @@ namespace ChanSort.Ui // create backup file if none exists if (File.Exists(currentTvFile)) { - string bakFile = currentTvFile + ".bak"; + var bakFile = currentTvFile + ".bak"; if (!File.Exists(bakFile)) File.Copy(currentTvFile, bakFile); } this.currentTvSerializer.Save(this.currentTvFile); // after saving old numbers match the new numbers - foreach (var list in this.dataRoot.ChannelLists) + foreach (var list in this.DataRoot.ChannelLists) { foreach (var chan in list.Channels) { @@ -890,9 +880,11 @@ namespace ChanSort.Ui this.splashScreenManager1.CloseWaitForm(); } } -#endregion -#region AddChannels() + #endregion + + #region AddChannels() + private void AddChannels() { var selectedChannels = this.GetSelectedChannels(gviewRight); @@ -906,7 +898,7 @@ namespace ChanSort.Ui this.gviewRight.BeginDataUpdate(); try { - lastInsertedChannel = this.editor.AddChannels(selectedChannels); + lastInsertedChannel = this.Editor.AddChannels(selectedChannels); this.UpdateInsertSlotTextBox(); } finally @@ -921,22 +913,23 @@ namespace ChanSort.Ui return; } - int index = this.currentChannelList.Channels.IndexOf(lastInsertedChannel); - int rowHandle = this.gviewLeft.GetRowHandle(index); + var index = this.CurrentChannelList.Channels.IndexOf(lastInsertedChannel); + var rowHandle = this.gviewLeft.GetRowHandle(index); if (this.rbInsertBefore.Checked) ++rowHandle; this.SelectFocusedRow(this.gviewLeft, rowHandle); } -#endregion -#region RemoveChannels() + #endregion + + #region RemoveChannels() private void RemoveChannels(GridView grid, bool closeGap) { var selectedChannels = this.GetSelectedChannels(grid); if (selectedChannels.Count == 0) return; - int focusedRow = this.gviewLeft.FocusedRowHandle - selectedChannels.Count; + var focusedRow = this.gviewLeft.FocusedRowHandle - selectedChannels.Count; if (!gviewLeft.IsLastRow) ++focusedRow; if (focusedRow < 0) focusedRow = 0; @@ -944,7 +937,7 @@ namespace ChanSort.Ui this.gviewLeft.BeginDataUpdate(); try { - this.editor.RemoveChannels(selectedChannels, closeGap); + this.Editor.RemoveChannels(selectedChannels, closeGap); } finally { @@ -955,20 +948,22 @@ namespace ChanSort.Ui this.UpdateInsertSlotTextBox(); } -#endregion + #endregion + + #region SelectFocusedRow() -#region SelectFocusedRow() private void SelectFocusedRow(GridView grid, int rowHandle) { grid.BeginSelection(); grid.ClearSelection(); grid.FocusedRowHandle = rowHandle; grid.SelectRow(rowHandle); - grid.EndSelection(); + grid.EndSelection(); } -#endregion -#region MoveChannels() + #endregion + + #region MoveChannels() private void MoveChannels(bool up) { @@ -979,7 +974,7 @@ namespace ChanSort.Ui this.gviewLeft.BeginDataUpdate(); try { - this.editor.MoveChannels(selectedChannels, up); + this.Editor.MoveChannels(selectedChannels, up); } finally { @@ -988,9 +983,10 @@ namespace ChanSort.Ui this.UpdateInsertSlotNumber(); } -#endregion + #endregion + + #region SetSlotNumber() -#region SetSlotNumber() private bool SetSlotNumber(string progNr) { int prog; @@ -1002,7 +998,7 @@ namespace ChanSort.Ui this.gviewRight.BeginDataUpdate(); try { - this.editor.SetSlotNumber(selectedChannels, prog, this.rbInsertSwap.Checked, this.cbCloseGap.Checked); + this.Editor.SetSlotNumber(selectedChannels, prog, this.rbInsertSwap.Checked, this.cbCloseGap.Checked); } finally { @@ -1011,9 +1007,11 @@ namespace ChanSort.Ui } return true; } -#endregion -#region SortSelectedChannels() + #endregion + + #region SortSelectedChannels() + private void SortSelectedChannels() { var selectedChannels = this.GetSelectedChannels(this.gviewLeft); @@ -1022,7 +1020,7 @@ namespace ChanSort.Ui this.gviewRight.BeginDataUpdate(); try { - this.editor.SortSelectedChannels(selectedChannels); + this.Editor.SortSelectedChannels(selectedChannels); } finally { @@ -1030,20 +1028,22 @@ namespace ChanSort.Ui this.gviewLeft.EndDataUpdate(); } } -#endregion -#region AddAllUnsortedChannels() + #endregion + + #region AddAllUnsortedChannels() + private void AddAllUnsortedChannels() { - if (this.currentChannelList == null) return; + if (this.CurrentChannelList == null) return; this.gviewRight.BeginDataUpdate(); this.gviewLeft.BeginDataUpdate(); - int maxNr = this.currentChannelList.InsertProgramNumber; - foreach (var channel in this.currentChannelList.Channels) + var maxNr = this.CurrentChannelList.InsertProgramNumber; + foreach (var channel in this.CurrentChannelList.Channels) maxNr = Math.Max(maxNr, channel.GetPosition(this.subListIndex)); var max = this.gviewRight.RowCount; - for (int handle = 0; handle GetSelectedChannels(GridView gview) { var channels = new List(); - foreach (int rowHandle in gview.GetSelectedRows()) + foreach (var rowHandle in gview.GetSelectedRows()) { if (gview.IsDataRow(rowHandle)) - channels.Add((ChannelInfo)gview.GetRow(rowHandle)); + channels.Add((ChannelInfo) gview.GetRow(rowHandle)); } return channels; } -#endregion -#region TryExecute() + #endregion + + #region TryExecute() private void TryExecute(Action action) { - try { action(); } - catch (Exception ex) { HandleException(ex); } + try + { + action(); + } + catch (Exception ex) + { + HandleException(ex); + } } -#endregion + #endregion + + #region HandleException() -#region HandleException() public static void HandleException(Exception ex) { XtraMessageBox.Show(string.Format(Resources.MainForm_TryExecute_Exception, ex)); } -#endregion -#region LoadSettings() + #endregion + + #region LoadSettings() private void LoadSettings() { // note: WindowSize must be restored in ctor in order to make WindowStartPosition.CenterScreen work if (!string.IsNullOrEmpty(Settings.Default.Encoding)) this.defaultEncoding = Encoding.GetEncoding(Settings.Default.Encoding); - - int width = Settings.Default.LeftPanelWidth; + + var width = Settings.Default.LeftPanelWidth; if (width > 0) this.splitContainerControl1.SplitterPosition = width; this.SelectLanguageMenuItem(); @@ -1118,17 +1131,19 @@ namespace ChanSort.Ui this.ClearLeftFilter(); this.ClearRightFilter(); - for (int i = MaxMruEntries-1; i >= 0; i--) + for (var i = MaxMruEntries - 1; i >= 0; i--) { var prop = Settings.Default.GetType().GetProperty("MruFile" + i); if (prop != null) - this.AddFileToMruList((string)prop.GetValue(Settings.Default, null)); + this.AddFileToMruList((string) prop.GetValue(Settings.Default, null)); } this.UpdateMruMenu(); } -#endregion -#region SelectLanguageMenuItem() + #endregion + + #region SelectLanguageMenuItem() + private void SelectLanguageMenuItem() { this.barManager1.ForceLinkCreate(); @@ -1143,19 +1158,21 @@ namespace ChanSort.Ui } } } -#endregion -#region SetGridLayout() + #endregion + + #region SetGridLayout() + private void SetGridLayout(GridView grid, string layout) { if (string.IsNullOrEmpty(layout)) return; - MemoryStream stream = new MemoryStream(); - using (StreamWriter wrt = new StreamWriter(stream)) + var stream = new MemoryStream(); + using (var wrt = new StreamWriter(stream)) { wrt.Write(layout); wrt.Flush(); stream.Seek(0, SeekOrigin.Begin); - OptionsLayoutGrid options = new OptionsLayoutGrid(); + var options = new OptionsLayoutGrid(); options.StoreDataSettings = true; options.StoreAppearance = false; options.StoreVisualOptions = false; @@ -1165,79 +1182,53 @@ namespace ChanSort.Ui // put the filter text back into the auto-filter-row foreach (GridColumn col in grid.Columns) { - string[] parts = (col.FilterInfo.FilterString ?? "").Split('\''); + var parts = (col.FilterInfo.FilterString ?? "").Split('\''); if (parts.Length >= 2) this.gviewRight.SetRowCellValue(GridControl.AutoFilterRowHandle, col, parts[1]); } } -#endregion -#region SaveSettings(), GetGridLayout() - private void SaveSettings() - { - this.gviewRight.PostEditor(); - this.gviewLeft.PostEditor(); + #endregion - Settings.Default.WindowSize = this.WindowState == FormWindowState.Normal ? this.Size : this.RestoreBounds.Size; - Settings.Default.Encoding = this.defaultEncoding.WebName; - Settings.Default.Language = Thread.CurrentThread.CurrentUICulture.Name; - Settings.Default.LeftPanelWidth = this.splitContainerControl1.SplitterPosition; - Settings.Default.OutputListLayout = GetGridLayout(this.gviewLeft); - if (this.currentChannelList != null) - SaveInputGridLayout(this.currentChannelList.SignalSource); - Settings.Default.ShowWarningsAfterLoading = this.miShowWarningsAfterLoad.Checked; - Settings.Default.CloseGaps = this.cbCloseGap.Checked; - for (int i = 0; i < this.mruFiles.Count; i++) - Settings.Default.GetType().GetProperty("MruFile" + i).SetValue(Settings.Default, this.mruFiles[i], null); + #region UpdateInsertSlotNumber() - Settings.Default.Save(); - } - - private string GetGridLayout(GridView grid) - { - MemoryStream stream = new MemoryStream(); - grid.SaveLayoutToStream(stream, OptionsLayoutBase.FullLayout); - stream.Seek(0, SeekOrigin.Begin); - using (StreamReader rdr = new StreamReader(stream, Encoding.UTF8)) - return rdr.ReadToEnd(); - } - -#endregion - -#region UpdateInsertSlotNumber() private void UpdateInsertSlotNumber() { - var channel = (ChannelInfo)this.gviewLeft.GetFocusedRow(); + var channel = (ChannelInfo) this.gviewLeft.GetFocusedRow(); int programNr; if (channel == null) - programNr = this.currentChannelList == null ? 1 : this.currentChannelList.FirstProgramNumber; + programNr = this.CurrentChannelList == null ? 1 : this.CurrentChannelList.FirstProgramNumber; else { programNr = channel.GetPosition(this.subListIndex); if (this.rbInsertAfter.Checked) ++programNr; } - if (this.currentChannelList != null) - this.currentChannelList.InsertProgramNumber = programNr; + if (this.CurrentChannelList != null) + this.CurrentChannelList.InsertProgramNumber = programNr; this.UpdateInsertSlotTextBox(); this.gviewLeft.SelectRow(this.gviewLeft.FocusedRowHandle); } -#endregion -#region UpdateInsertSlotTextBox() + #endregion + + #region UpdateInsertSlotTextBox() + private void UpdateInsertSlotTextBox() { - int programNr = this.currentChannelList == null ? 0 : this.currentChannelList.InsertProgramNumber; + var programNr = this.CurrentChannelList == null ? 0 : this.CurrentChannelList.InsertProgramNumber; this.txtSetSlot.Text = programNr.ToString(); } -#endregion -#region FillMenuWithIsoEncodings() + #endregion + + #region FillMenuWithIsoEncodings() + private void FillMenuWithIsoEncodings() { this.miIsoCharSets.Strings.Clear(); this.isoEncodings.Clear(); - foreach(var encoding in Encoding.GetEncodings()) + foreach (var encoding in Encoding.GetEncodings()) { if (!encoding.Name.StartsWith("iso")) continue; @@ -1245,9 +1236,11 @@ namespace ChanSort.Ui this.isoEncodings.Add(encoding.Name); } } -#endregion -#region ShowCharsetForm() + #endregion + + #region ShowCharsetForm() + private void ShowCharsetForm() { using (var form = new CharsetForm(this.defaultEncoding)) @@ -1257,9 +1250,11 @@ namespace ChanSort.Ui form.ShowDialog(this); } } -#endregion -#region SetDefaultEncoding() + #endregion + + #region SetDefaultEncoding() + private void SetDefaultEncoding(Encoding encoding) { this.defaultEncoding = encoding; @@ -1271,33 +1266,15 @@ namespace ChanSort.Ui this.gviewRight.EndDataUpdate(); this.gviewLeft.EndDataUpdate(); } -#endregion -#region ClearLeftFilter(), ClearRightFilter() - private void ClearLeftFilter() - { - this.gviewLeft.BeginSort(); - this.gviewLeft.ClearColumnsFilter(); - this.colOutSlot.FilterInfo = new ColumnFilterInfo("[Position]<>-1"); - this.gviewLeft.EndSort(); - } + #endregion - private void ClearRightFilter() - { - this.gviewRight.BeginSort(); - this.gviewRight.ClearColumnsFilter(); - this.colSlotOld.FilterInfo = new ColumnFilterInfo("[OldProgramNr]<>-1"); - if (this.subListIndex > 0) - this.colPrNr.FilterInfo = new ColumnFilterInfo("[NewProgramNr]<>-1"); - this.gviewRight.EndSort(); - } -#endregion + #region LoadInputGridLayout() -#region LoadInputGridLayout() private void LoadInputGridLayout() { #if false - // code disabled because it causes unpredictable column order when working with different file formats which may of may not show columns + // code disabled because it causes unpredictable column order when working with different file formats which may of may not show columns string newLayout; var newSource = list.SignalSource; @@ -1314,21 +1291,25 @@ namespace ChanSort.Ui this.ShowGridColumns(this.gviewRight); this.ClearRightFilter(); } -#endregion -#region ShowGridColumns() + #endregion + + #region ShowGridColumns() + private void ShowGridColumns(GridView gview) { - int visIndex = 0; + var visIndex = 0; foreach (GridColumn col in gview.Columns) col.VisibleIndex = GetGridColumnVisibility(col) ? visIndex++ : -1; } -#endregion -#region SaveInputGridLayout() + #endregion + + #region SaveInputGridLayout() + private void SaveInputGridLayout(SignalSource signalSource) { - string currentLayout = GetGridLayout(this.gviewRight); + var currentLayout = GetGridLayout(this.gviewRight); if ((signalSource & SignalSource.Analog) != 0) Settings.Default.InputGridLayoutAnalog = currentLayout; else if ((signalSource & SignalSource.DvbS) != 0) @@ -1336,13 +1317,14 @@ namespace ChanSort.Ui else //if ((signalSource & SignalSource.DvbCT) != 0) Settings.Default.InputGridLayoutDvbCT = currentLayout; } -#endregion -#region GetGridColumnVisibility() + #endregion + + #region GetGridColumnVisibility() private bool GetGridColumnVisibility(GridColumn col) { - var list = this.currentChannelList; + var list = this.CurrentChannelList; var filter = list.VisibleColumnFieldNames; if (filter != null && !filter.Contains(col.FieldName)) return false; @@ -1376,26 +1358,29 @@ namespace ChanSort.Ui return true; } -#endregion + #endregion + + #region SetFavorite() -#region SetFavorite() private void SetFavorite(string fav, bool set) { if (string.IsNullOrEmpty(fav)) return; - char ch = Char.ToUpper(fav[0]); - if (ch<'A' || ch>'E' || this.subListIndex == ch-'A'+1) return; + var ch = char.ToUpper(fav[0]); + if (ch < 'A' || ch > 'E' || this.subListIndex == ch - 'A' + 1) return; var list = this.GetSelectedChannels(this.lastFocusedGrid); if (list.Count == 0) return; this.gviewRight.BeginDataUpdate(); this.gviewLeft.BeginDataUpdate(); - this.editor.SetFavorites(list, (Favorites) (1 << (ch - 'A')), set); + this.Editor.SetFavorites(list, (Favorites) (1 << (ch - 'A')), set); this.gviewRight.EndDataUpdate(); this.gviewLeft.EndDataUpdate(); } -#endregion -#region SetChannelFlag() + #endregion + + #region SetChannelFlag() + private void SetChannelFlag(Action setFlag) { var list = this.GetSelectedChannels(this.lastFocusedGrid); @@ -1407,24 +1392,28 @@ namespace ChanSort.Ui setFlag(channel); this.gviewRight.EndDataUpdate(); this.gviewLeft.EndDataUpdate(); - this.dataRoot.NeedsSaving = true; + this.DataRoot.NeedsSaving = true; } -#endregion -#region NavigateToChannel + #endregion + + #region NavigateToChannel + private void NavigateToChannel(ChannelInfo channel, GridView view) { if (channel == null) return; - int rowHandle = view.GetRowHandle(this.currentChannelList.Channels.IndexOf(channel)); + var rowHandle = view.GetRowHandle(this.CurrentChannelList.Channels.IndexOf(channel)); if (view.IsValidRowHandle(rowHandle)) { this.SelectFocusedRow(view, rowHandle); view.MakeRowVisible(rowHandle); } } -#endregion -#region SetActiveGrid() + #endregion + + #region SetActiveGrid() + private void SetActiveGrid(GridView grid) { if (grid == this.gviewLeft) @@ -1443,14 +1432,16 @@ namespace ChanSort.Ui } this.UpdateMenu(); } -#endregion -#region UpdateMenu + #endregion + + #region UpdateMenu + private void UpdateMenu() { - bool fileLoaded = this.dataRoot != null; - bool isRight = this.lastFocusedGrid == this.gviewRight; - bool mayEdit = fileLoaded && this.currentChannelList != null && (!this.currentChannelList.ReadOnly || this.miAllowEditPredefinedLists.Down); + var fileLoaded = this.DataRoot != null; + var isRight = this.lastFocusedGrid == this.gviewRight; + var mayEdit = fileLoaded && this.CurrentChannelList != null && (!this.CurrentChannelList.ReadOnly || this.miAllowEditPredefinedLists.Down); foreach (BarItemLink link in this.miEdit.ItemLinks) link.Item.Enabled = mayEdit; @@ -1460,11 +1451,11 @@ namespace ChanSort.Ui this.btnRemoveLeft.Enabled = mayEdit; this.btnRemoveRight.Enabled = mayEdit; this.btnRenum.Enabled = mayEdit; - this.btnToggleFavA.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.A) != 0 && this.subListIndex != 1; - this.btnToggleFavB.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.B) != 0 && this.subListIndex != 2; - this.btnToggleFavC.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.C) != 0 && this.subListIndex != 3; - this.btnToggleFavD.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.D) != 0 && this.subListIndex != 4; - this.btnToggleFavE.Enabled = mayEdit && (this.dataRoot.SupportedFavorites & Favorites.E) != 0 && this.subListIndex != 5; + this.btnToggleFavA.Enabled = mayEdit && (this.DataRoot.SupportedFavorites & Favorites.A) != 0 && this.subListIndex != 1; + this.btnToggleFavB.Enabled = mayEdit && (this.DataRoot.SupportedFavorites & Favorites.B) != 0 && this.subListIndex != 2; + this.btnToggleFavC.Enabled = mayEdit && (this.DataRoot.SupportedFavorites & Favorites.C) != 0 && this.subListIndex != 3; + this.btnToggleFavD.Enabled = mayEdit && (this.DataRoot.SupportedFavorites & Favorites.D) != 0 && this.subListIndex != 4; + this.btnToggleFavE.Enabled = mayEdit && (this.DataRoot.SupportedFavorites & Favorites.E) != 0 && this.subListIndex != 5; this.btnToggleLock.Enabled = mayEdit; this.miReload.Enabled = fileLoaded; @@ -1489,23 +1480,25 @@ namespace ChanSort.Ui this.miAddChannel.Visibility = visRight; this.miSkipOn.Enabled = this.miSkipOff.Enabled = this.currentTvSerializer?.Features.CanSkipChannels ?? false; - bool isLeftGridSortedByNewProgNr = this.IsLeftGridSortedByNewProgNr; + var isLeftGridSortedByNewProgNr = this.IsLeftGridSortedByNewProgNr; var sel = this.gviewLeft.GetSelectedRows(); var channel = sel.Length == 0 ? null : (ChannelInfo) this.gviewLeft.GetRow(sel[0]); this.miMoveUp.Enabled = this.btnUp.Enabled = mayEdit && isLeftGridSortedByNewProgNr && channel != null - && channel.GetPosition(this.subListIndex) > this.currentChannelList.FirstProgramNumber; + && channel.GetPosition(this.subListIndex) > this.CurrentChannelList.FirstProgramNumber; this.miMoveDown.Enabled = this.btnDown.Enabled = mayEdit && isLeftGridSortedByNewProgNr; - this.miTvSettings.Enabled = this.currentTvSerializer != null && this.currentTvSerializer.Features.DeviceSettings; + this.miTvSettings.Enabled = this.currentTvSerializer != null && this.currentTvSerializer.Features.DeviceSettings; this.miCleanupChannels.Enabled = this.currentTvSerializer != null && this.currentTvSerializer.Features.CleanUpChannelData; this.mnuFavList.Enabled = this.grpSubList.Visible; this.txtSetSlot.Enabled = mayEdit; } -#endregion -#region UpdateMruMenu() + #endregion + + #region UpdateMruMenu() + private void UpdateMruMenu() { this.miRecentFiles.Strings.Clear(); @@ -1514,12 +1507,14 @@ namespace ChanSort.Ui var key = Path.GetFileName(Path.GetDirectoryName(file)) + "\\" + Path.GetFileName(file); if (key != file) key = "...\\" + key; - this.miRecentFiles.Strings.Add(key); + this.miRecentFiles.Strings.Add(key); } } -#endregion -#region RestoreBackupFile() + #endregion + + #region RestoreBackupFile() + private void RestoreBackupFile() { var bakFile = this.currentTvFile + ".bak"; @@ -1532,9 +1527,9 @@ namespace ChanSort.Ui } if (XtraMessageBox.Show(this, - Resources.MainForm_miRestoreOriginal_ItemClick_Confirm, - this.miRestoreOriginal.Caption, - MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) != + Resources.MainForm_miRestoreOriginal_ItemClick_Confirm, + this.miRestoreOriginal.Caption, + MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) != DialogResult.Yes) { return; @@ -1552,86 +1547,81 @@ namespace ChanSort.Ui XtraMessageBox.Show(this, string.Format(Resources.MainForm_miRestoreOriginal_Message, this.currentTvFile), this.miRestoreOriginal.Caption, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - } + } } -#endregion -#region ShowFileInformation() + #endregion + + #region ShowFileInformation() + private void ShowFileInformation() { if (this.currentTvSerializer == null) return; var info = this.currentTvSerializer.GetFileInformation(); - if (this.dataRoot.Warnings.Length > 0) + if (this.DataRoot.Warnings.Length > 0) { - var lines = this.dataRoot.Warnings.ToString().Split('\n'); + var lines = this.DataRoot.Warnings.ToString().Split('\n'); Array.Sort(lines); - var sortedWarnings = String.Join("\n", lines); + var sortedWarnings = string.Join("\n", lines); info += "\r\n\r\n\r\n" + Resources.MainForm_LoadFiles_ValidationWarningMsg + "\r\n\r\n" + sortedWarnings; } - InfoBox.Show(this, info, this.miFileInformation.Caption.Replace("...", "").Replace("&","")); + InfoBox.Show(this, info, this.miFileInformation.Caption.Replace("...", "").Replace("&", "")); } -#endregion -#region VerifyChannelNameModified() + #endregion + + #region VerifyChannelNameModified() + private void VerifyChannelNameModified(ChannelInfo info, string newName) { if (newName != info.Name) info.IsNameModified = true; } -#endregion -#region RefreshGrid() + #endregion - internal void RefreshGrids() - { - RefreshGrid(this.gviewLeft, this.gviewRight); - } + #region ShowTvCountrySettings() - private void RefreshGrid(params GridView[] grids) - { - foreach (var grid in grids) - { - grid.BeginDataUpdate(); - grid.EndDataUpdate(); - } - } -#endregion - -#region ShowTvCountrySettings() private void ShowTvCountrySettings() { if (this.currentTvSerializer != null) this.currentTvSerializer.ShowDeviceSettingsForm(this); } -#endregion -#region ToggleFavorite() + #endregion + + #region ToggleFavorite() + private void ToggleFavorite(string fav) { var list = this.GetSelectedChannels(this.gviewLeft); if (list.Count == 0) return; - var value = (Favorites)Enum.Parse(typeof (Favorites), fav); - this.SetFavorite(fav, (list[0].Favorites&value) == 0); + var value = (Favorites) Enum.Parse(typeof (Favorites), fav); + this.SetFavorite(fav, (list[0].Favorites & value) == 0); this.RefreshGrid(gviewLeft, gviewRight); } -#endregion -#region ToggleLock() + #endregion + + #region ToggleLock() + private void ToggleLock() { var list = this.GetSelectedChannels(this.gviewLeft); if (list.Count == 0) return; - bool setLock = !list[0].Lock; + var setLock = !list[0].Lock; foreach (var channel in list) channel.Lock = setLock; this.RefreshGrid(gviewLeft, gviewRight); } -#endregion -#region RenameChannel() + #endregion + + #region RenameChannel() + private void RenameChannel() { if (this.lastFocusedGrid == null) return; @@ -1643,9 +1633,11 @@ namespace ChanSort.Ui this.dontOpenEditor = false; this.lastFocusedGrid.ShowEditor(); } -#endregion -#region CleanupChannelData() + #endregion + + #region CleanupChannelData() + private void CleanupChannelData() { if (this.currentTvSerializer != null && this.currentTvSerializer.Features.CleanUpChannelData) @@ -1656,20 +1648,22 @@ namespace ChanSort.Ui this.RefreshGrid(gviewLeft, gviewRight); } } -#endregion -#region ExportExcelList() + #endregion + + #region ExportExcelList() + private void ExportExcelList() { const string header = "List;Pr#;Channel Name;Favorites;Lock;Skip;Hide;Encrypted;Satellite;Ch/Tp;Freq;ONID;TSID;SymRate;SID;VPID;APID"; const char sep = '\t'; var sb = new StringBuilder(); sb.AppendLine(header.Replace(';', sep)); - foreach (var list in this.dataRoot.ChannelLists) + foreach (var list in this.DataRoot.ChannelLists) { foreach (var channel in list.Channels.OrderBy(c => c.NewProgramNr)) { - if (channel.IsDeleted || channel.OldProgramNr == -1) + if (channel.IsDeleted || channel.OldProgramNr == -1) continue; sb.Append(list.ShortCaption).Append(sep); sb.Append(channel.NewProgramNr).Append(sep); @@ -1688,29 +1682,755 @@ namespace ChanSort.Ui sb.Append(channel.ServiceId).Append(sep); sb.Append(channel.VideoPid).Append(sep); sb.Append(channel.AudioPid); - + sb.AppendLine(); } } Clipboard.Clear(); Clipboard.SetData(DataFormats.Text, sb.ToString()); - XtraMessageBox.Show(this, - Resources.MainForm_ExportExcelList_Message, - this.miExcelExport.Caption, - MessageBoxButtons.OK, MessageBoxIcon.Information); + XtraMessageBox.Show(this, + Resources.MainForm_ExportExcelList_Message, + this.miExcelExport.Caption, + MessageBoxButtons.OK, MessageBoxIcon.Information); } -#endregion -#region Print() + #endregion + + #region Print() + private void Print() { - using (var dlg = new Printing.ReportOptionsDialog(this.currentChannelList, this.subListIndex)) + using (var dlg = new ReportOptionsDialog(this.CurrentChannelList, this.subListIndex)) dlg.ShowDialog(this); } -#endregion -#region Accessibility + #endregion + + // UI events + + #region MainForm_Load + + private void MainForm_Load(object sender, EventArgs e) + { + this.TryExecute(this.LoadSettings); + this.TryExecute(this.InitAppAfterMainWindowWasShown); + } + + #endregion + + #region ProcessCmdKey() + + protected override bool ProcessCmdKey(ref Message msg, Keys keyData) + { + if (keyData == Keys.F1) + { + this.popupInputSource.ShowPopup(this.tabChannelList.PointToScreen(new Point(0, this.tabChannelList.Height))); + return true; + } + + if (keyData == (Keys.F1 | Keys.Shift)) + { + this.popupFavList.ShowPopup(this.tabSubList.PointToScreen(new Point(0, this.tabSubList.Height))); + return true; + } + return base.ProcessCmdKey(ref msg, keyData); + } + + #endregion + + #region Language menu + + private void miLanguage_DownChanged(object sender, ItemClickEventArgs e) + { + try + { + if (this.ignoreLanguageChange) + return; + var menuItem = (BarButtonItem) sender; + if (!menuItem.Down) + return; + if (!this.PromptSaveAndContinue()) + return; + var locale = (string) menuItem.Tag; + Program.ChangeLanguage = true; + Thread.CurrentThread.CurrentUICulture = new CultureInfo(locale); + this.Close(); + } + catch (Exception ex) + { + HandleException(ex); + } + } + + #endregion + + // -- controls + + #region picDonate_Click + + private void picDonate_Click(object sender, EventArgs e) + { + BrowserHelper.OpenHtml(Resources.paypal_button); + } + + #endregion + + #region tabChannelList_SelectedPageChanged + + private void tabChannelList_SelectedPageChanged(object sender, TabPageChangedEventArgs e) + { + this.TryExecute(() => ShowChannelList(e.Page == null ? null : (ChannelList) e.Page.Tag)); + } + + #endregion + + #region tabSubList_SelectedPageChanged + + private void tabSubList_SelectedPageChanged(object sender, TabPageChangedEventArgs e) + { + this.subListIndex = this.tabSubList.SelectedTabPageIndex; + this.ShowGridColumns(this.gviewRight); + + this.Editor.SubListIndex = this.subListIndex; + this.gviewLeft.BeginSort(); + this.gviewLeft.EndSort(); + this.gviewRight.BeginSort(); + if (this.subListIndex > 0) + this.colPrNr.FilterInfo = new ColumnFilterInfo("[NewProgramNr]<>-1"); + else + this.colPrNr.ClearFilter(); + this.gviewRight.EndSort(); + } + + #endregion + + #region gview_CustomUnboundColumnData + + private void gview_CustomUnboundColumnData(object sender, CustomColumnDataEventArgs e) + { + var channel = (ChannelInfo) e.Row; + if (e.Column.FieldName == "Position") + e.Value = channel.GetPosition(this.subListIndex); + else if (e.Column.FieldName == "OldPosition") + e.Value = channel.GetOldPosition(this.subListIndex); + } + + #endregion + + #region gview_MouseMove + + private void gview_MouseMove(object sender, MouseEventArgs e) + { + try + { + var view = (GridView) sender; + if (this.downHit == null || downHit.RowHandle < 0 || e.Button != MouseButtons.Left || view.ActiveEditor != null || ModifierKeys != Keys.None) + return; + if (this.CurrentChannelList == null || this.CurrentChannelList.ReadOnly) + return; + // drag/drop only allowed when left grid is sorted by NewSlotNr + if (!this.IsLeftGridSortedByNewProgNr) + return; + if (Math.Abs(e.Y - downHit.HitPoint.Y) < SystemInformation.DragSize.Height && + Math.Abs(e.X - downHit.HitPoint.X) < SystemInformation.DragSize.Width) + return; + + // start drag operation + var channel = (ChannelInfo) view.GetRow(downHit.RowHandle); + this.dragDropInfo = new DragDropInfo(view, channel.GetPosition(this.subListIndex)); + view.GridControl.DoDragDrop(this.dragDropInfo, DragDropEffects.Move); + this.downHit = null; + } + catch (Exception ex) + { + HandleException(ex); + } + } + + #endregion + + #region grid_GiveFeedback + + private void grid_GiveFeedback(object sender, GiveFeedbackEventArgs e) + { + // this event is called on the source of the drag operation + e.UseDefaultCursors = false; + if (e.Effect == DragDropEffects.Move) + { + if (this.dragDropInfo.EditMode == EditMode.InsertBefore) + Cursor.Current = Cursors.PanNE; + else if (this.dragDropInfo.EditMode == EditMode.InsertAfter) + Cursor.Current = Cursors.PanSE; + else + Cursor.Current = Cursors.HSplit; + } + else if (sender == this.gridRight) + Cursor.Current = Cursors.PanWest; + else + Cursor.Current = Cursors.No; + } + + #endregion + + #region gridLeft_DragOver + + private void gridLeft_DragOver(object sender, DragEventArgs e) + { + if (this.dragDropInfo == null) // drag operation from outside ChanSort + return; + + // this event is called on the current target of the drag operation + var point = this.gridLeft.PointToClient(MousePosition); + var hit = this.gviewLeft.CalcHitInfo(point); + if (hit.RowHandle >= 0) + { + var vi = (GridViewInfo) this.gviewLeft.GetViewInfo(); + var rowInfo = vi.GetGridRowInfo(hit.RowHandle); + var dropChannel = (ChannelInfo) this.gviewLeft.GetRow(hit.RowHandle); + var moveUp = this.dragDropInfo.SourcePosition < 0 || dropChannel.GetPosition(this.subListIndex) <= this.dragDropInfo.SourcePosition; + if (moveUp && point.Y < rowInfo.Bounds.Top + rowInfo.Bounds.Height/2) + this.dragDropInfo.EditMode = EditMode.InsertBefore; + else if (!moveUp && point.Y > rowInfo.Bounds.Top + rowInfo.Bounds.Height/2) + this.dragDropInfo.EditMode = EditMode.InsertAfter; + else if (this.dragDropInfo.SourceView == this.gviewLeft) + this.dragDropInfo.EditMode = EditMode.Swap; + else if (moveUp) + this.dragDropInfo.EditMode = EditMode.InsertAfter; + else + this.dragDropInfo.EditMode = EditMode.InsertBefore; + + this.dragDropInfo.DropRowHandle = hit.RowHandle; + e.Effect = DragDropEffects.Move; + return; + } + + e.Effect = DragDropEffects.None; + this.dragDropInfo.DropRowHandle = GridControl.InvalidRowHandle; + } + + #endregion + + #region gridLeft_DragDrop + + private void gridLeft_DragDrop(object sender, DragEventArgs e) + { + try + { + if (this.dragDropInfo.DropRowHandle < 0) return; + this.curEditMode = this.dragDropInfo.EditMode; + var dropChannel = (ChannelInfo) this.gviewLeft.GetRow(this.dragDropInfo.DropRowHandle); + + var selectedChannels = this.GetSelectedChannels(this.dragDropInfo.SourceView); + int newProgNr; + var dropPos = dropChannel.GetPosition(this.subListIndex); + if (this.dragDropInfo.EditMode != EditMode.InsertAfter || !this.cbCloseGap.Checked) + newProgNr = dropPos; + else + { + var numberOfChannelsToMoveDown = 0; + foreach (var channel in selectedChannels) + { + var curPos = channel.GetPosition(this.subListIndex); + if (curPos != -1 && curPos <= dropPos) + ++numberOfChannelsToMoveDown; + } + newProgNr = dropPos + 1 - numberOfChannelsToMoveDown; + } + + this.Editor.SetSlotNumber(selectedChannels, newProgNr, this.dragDropInfo.EditMode == EditMode.Swap, this.cbCloseGap.Checked); + this.RefreshGrid(this.gviewLeft, this.gviewRight); + } + catch (Exception ex) + { + HandleException(ex); + } + } + + #endregion + + #region gridLeft_ProcessGridKey + + private void gridLeft_ProcessGridKey(object sender, KeyEventArgs e) + { + if (this.CurrentChannelList != null && this.CurrentChannelList.ReadOnly) + return; + if (gviewLeft.ActiveEditor != null) + return; + if (e.KeyCode == Keys.Delete) + TryExecute(() => this.RemoveChannels(this.gviewLeft, this.cbCloseGap.Checked)); + else if (e.KeyCode == Keys.Add) + TryExecute(() => this.MoveChannels(false)); + else if (e.KeyCode == Keys.Subtract) + TryExecute(() => this.MoveChannels(true)); + else + return; + e.Handled = true; + e.SuppressKeyPress = true; + } + + #endregion + + #region gviewLeft_FocusedRowChanged + + private void gviewLeft_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e) + { + TryExecute(UpdateInsertSlotNumber); + } + + #endregion + + #region gviewLeft_SelectionChanged + + private void gviewLeft_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + this.UpdateMenu(); + } + + #endregion + + #region gviewLeft_CustomColumnDisplayText + + private void gviewLeft_CustomColumnDisplayText(object sender, CustomColumnDisplayTextEventArgs e) + { + if (e.Column == this.colOutFav) + { + if (!(e.Value is Favorites)) return; + if ((Favorites) e.Value == 0) + e.DisplayText = string.Empty; + } + } + + #endregion + + #region gviewLeft_RowCellStyle + + private void gviewLeft_RowCellStyle(object sender, RowCellStyleEventArgs e) + { + var channel = (ChannelInfo) this.gviewLeft.GetRow(e.RowHandle); + if (channel == null) return; + if (channel.OldProgramNr == -1) + { + e.Appearance.ForeColor = Color.Red; + e.Appearance.Options.UseForeColor = true; + } + else if (channel.Hidden) + { + e.Appearance.ForeColor = Color.LightGray; + e.Appearance.Options.UseForeColor = true; + } + else if (channel.Skip) + { + e.Appearance.ForeColor = Color.Blue; + e.Appearance.Options.UseForeColor = true; + } + } + + #endregion + + #region gviewLeft_ValidatingEditor + + private void gviewLeft_ValidatingEditor(object sender, BaseContainerValidateEditorEventArgs e) + { + try + { + if (gviewLeft.FocusedRowHandle == GridControl.AutoFilterRowHandle) + return; + if (this.gviewLeft.FocusedColumn == this.colOutSlot && e.Value is string) + e.Valid = this.SetSlotNumber((string) e.Value); + else if (this.gviewLeft.FocusedColumn == this.colOutFav && e.Value is string) + e.Value = ChannelInfo.ParseFavString((string) e.Value); + else if (gviewLeft.FocusedColumn == this.colOutName) + { + this.VerifyChannelNameModified(this.gviewLeft.GetFocusedRow() as ChannelInfo, e.Value as string); + this.BeginInvoke((Action) (() => RefreshGrid(this.gviewLeft))); + } + DataRoot.NeedsSaving = true; + } + catch (Exception ex) + { + HandleException(ex); + } + } + + #endregion + + #region gviewLeft_CellValueChanged + + private void gviewLeft_CellValueChanged(object sender, CellValueChangedEventArgs e) + { + this.gviewRight.BeginDataUpdate(); + this.gviewRight.EndDataUpdate(); + } + + #endregion + + #region gviewLeft_PopupMenuShowing + + private void gviewLeft_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) + { + this.lastFocusedGrid = this.gviewLeft; + this.UpdateMenu(); + if (e.MenuType == GridMenuType.Row && e.HitInfo.InRow && this.gviewLeft.IsDataRow(e.HitInfo.RowHandle)) + this.popupContext.ShowPopup(this.gridLeft.PointToScreen(e.Point)); + } + + #endregion + + #region gviewLeft_RowClick + + private void gviewLeft_RowClick(object sender, RowClickEventArgs e) + { + if (e.Clicks == 2 && e.Button == MouseButtons.Left && this.gviewLeft.IsDataRow(e.RowHandle)) + { + var channel = (ChannelInfo) this.gviewLeft.GetRow(e.RowHandle); + this.NavigateToChannel(channel, this.gviewRight); + } + } + + #endregion + + #region gviewLeft_EndSorting + + private void gviewLeft_EndSorting(object sender, EventArgs e) + { + TryExecute(this.UpdateMenu); + } + + #endregion + + #region gridRight_ProcessGridKey + + private void gridRight_ProcessGridKey(object sender, KeyEventArgs e) + { + if (this.gviewRight.ActiveEditor != null) + return; + if (e.KeyCode == Keys.Enter && this.CurrentChannelList != null && !this.CurrentChannelList.ReadOnly) + { + TryExecute(this.AddChannels); + e.Handled = true; + } + } + + #endregion + + #region gviewRight_FocusedRowChanged + + private void gviewRight_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e) + { + this.gviewRight.SelectRow(e.FocusedRowHandle); + } + + #endregion + + #region gviewRight_CustomColumnDisplayText + + private void gviewRight_CustomColumnDisplayText(object sender, CustomColumnDisplayTextEventArgs e) + { + if (e.Column == this.colSlotNew || e.Column == this.colSlotOld || e.Column == this.colPrNr) + { + if (!(e.Value is int)) return; + if ((int) e.Value == -1) + e.DisplayText = string.Empty; + } + else if (e.Column == this.colFavorites) + { + if (!(e.Value is Favorites)) return; + if ((Favorites) e.Value == 0) + e.DisplayText = string.Empty; + } + } + + #endregion + + #region gviewRight_RowCellStyle + + private void gviewRight_RowCellStyle(object sender, RowCellStyleEventArgs e) + { + var channel = (ChannelInfo) this.gviewRight.GetRow(e.RowHandle); + if (channel == null) return; + if (channel.OldProgramNr == -1) + { + e.Appearance.ForeColor = Color.Red; + e.Appearance.Options.UseForeColor = true; + } + else if (channel.GetPosition(this.subListIndex) != -1) + { + e.Appearance.ForeColor = Color.Gray; + e.Appearance.Options.UseForeColor = true; + } + } + + #endregion + + #region gviewRight_RowClick + + private void gviewRight_RowClick(object sender, RowClickEventArgs e) + { + if (e.Clicks == 2 && e.Button == MouseButtons.Left && this.gviewRight.IsDataRow(e.RowHandle)) + TryExecute(this.AddChannels); + } + + #endregion + + #region gviewRight_ValidatingEditor + + private void gviewRight_ValidatingEditor(object sender, BaseContainerValidateEditorEventArgs e) + { + try + { + if (gviewRight.FocusedRowHandle == GridControl.AutoFilterRowHandle) + return; + if (this.gviewRight.FocusedColumn == this.colSlotNew && e.Value is string) + e.Valid = this.SetSlotNumber((string) e.Value); + else if (this.gviewRight.FocusedColumn == this.colFavorites && e.Value is string) + e.Value = ChannelInfo.ParseFavString((string) e.Value); + else if (gviewRight.FocusedColumn == this.colName) + { + var ci = this.gviewRight.GetFocusedRow() as ChannelInfo; + this.VerifyChannelNameModified(ci, e.Value as string); + //this.BeginInvoke((Action) (() => RefreshGrid(this.gviewLeft))); + } + DataRoot.NeedsSaving = true; + } + catch (Exception ex) + { + HandleException(ex); + } + } + + #endregion + + #region gviewRight_CellValueChanged + + private void gviewRight_CellValueChanged(object sender, CellValueChangedEventArgs e) + { + TryExecute(() => RefreshGrid(this.gviewLeft)); + } + + #endregion + + #region gviewRight_PopupMenuShowing + + private void gviewRight_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) + { + this.lastFocusedGrid = this.gviewRight; + this.UpdateMenu(); + if (e.MenuType == GridMenuType.Row) + this.popupContext.ShowPopup(this.gridRight.PointToScreen(e.Point)); + } + + #endregion + + #region rbInsertMode_CheckedChanged + + private void rbInsertMode_CheckedChanged(object sender, EventArgs e) + { + if (!((CheckEdit) sender).Checked) + return; + try + { + if (this.CurrentChannelList == null) + return; + var delta = this.curEditMode == EditMode.InsertAfter + ? -1 + : this.rbInsertAfter.Checked ? +1 : 0; + this.CurrentChannelList.InsertProgramNumber += delta; + this.UpdateInsertSlotTextBox(); + this.curEditMode = this.rbInsertBefore.Checked + ? EditMode.InsertBefore + : this.rbInsertAfter.Checked + ? EditMode.InsertAfter + : EditMode.Swap; + } + catch (Exception ex) + { + HandleException(ex); + } + } + + #endregion + + #region btnAdd_Click + + private void btnAdd_Click(object sender, EventArgs e) + { + TryExecute(this.AddChannels); + } + + #endregion + + #region txtSetSlot_EditValueChanged + + private void txtSetSlot_EditValueChanged(object sender, EventArgs e) + { + TryExecute(() => + { + int nr; + int.TryParse(this.txtSetSlot.Text, out nr); + if (this.CurrentChannelList != null) + this.CurrentChannelList.InsertProgramNumber = nr; + }); + } + + #endregion + + #region btnRenum_Click + + private void btnRenum_Click(object sender, EventArgs e) + { + TryExecute(this.RenumberSelectedChannels); + } + + #endregion + + #region MainForm_FormClosing + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (this.PromptSaveAndContinue()) + this.SaveSettings(); + else + e.Cancel = true; + } + + #endregion + + #region btnAddAll_Click + + private void btnAddAll_Click(object sender, EventArgs e) + { + this.TryExecute(this.AddAllUnsortedChannels); + } + + #endregion + + #region miRenumFavByPrNr_ItemClick + + private void miRenumFavByPrNr_ItemClick(object sender, ItemClickEventArgs e) + { + TryExecute(this.Editor.ApplyPrNrToFavLists); + this.RefreshGrid(this.gviewLeft, this.gviewRight); + } + + #endregion + + #region miAllowEditPredefinedLists_DownChanged + + private void miAllowEditPredefinedLists_DownChanged(object sender, ItemClickEventArgs e) + { + TryExecute(() => + { + this.UpdateGridReadOnly(); + this.UpdateMenu(); + }); + } + + #endregion + + #region enum EditMode + + private enum EditMode + { + InsertBefore = 0, + InsertAfter = 1, + Swap = 2 + } + + #endregion + + #region class DragDropInfo + + private class DragDropInfo + { + public readonly int SourcePosition; + public readonly GridView SourceView; + public int DropRowHandle = -1; + public EditMode EditMode; + + public DragDropInfo(GridView source, int sourcePosition) + { + this.SourceView = source; + this.SourcePosition = sourcePosition; + } + } + + #endregion + + #region SaveSettings(), GetGridLayout() + + private void SaveSettings() + { + this.gviewRight.PostEditor(); + this.gviewLeft.PostEditor(); + + Settings.Default.WindowSize = this.WindowState == FormWindowState.Normal ? this.Size : this.RestoreBounds.Size; + Settings.Default.Encoding = this.defaultEncoding.WebName; + Settings.Default.Language = Thread.CurrentThread.CurrentUICulture.Name; + Settings.Default.LeftPanelWidth = this.splitContainerControl1.SplitterPosition; + Settings.Default.OutputListLayout = GetGridLayout(this.gviewLeft); + if (this.CurrentChannelList != null) + SaveInputGridLayout(this.CurrentChannelList.SignalSource); + Settings.Default.ShowWarningsAfterLoading = this.miShowWarningsAfterLoad.Checked; + Settings.Default.CloseGaps = this.cbCloseGap.Checked; + for (var i = 0; i < this.mruFiles.Count; i++) + Settings.Default.GetType().GetProperty("MruFile" + i).SetValue(Settings.Default, this.mruFiles[i], null); + + Settings.Default.Save(); + } + + private string GetGridLayout(GridView grid) + { + var stream = new MemoryStream(); + grid.SaveLayoutToStream(stream, OptionsLayoutBase.FullLayout); + stream.Seek(0, SeekOrigin.Begin); + using (var rdr = new StreamReader(stream, Encoding.UTF8)) + return rdr.ReadToEnd(); + } + + #endregion + + #region ClearLeftFilter(), ClearRightFilter() + + private void ClearLeftFilter() + { + this.gviewLeft.BeginSort(); + this.gviewLeft.ClearColumnsFilter(); + this.colOutSlot.FilterInfo = new ColumnFilterInfo("[Position]<>-1"); + this.gviewLeft.EndSort(); + } + + private void ClearRightFilter() + { + this.gviewRight.BeginSort(); + this.gviewRight.ClearColumnsFilter(); + this.colSlotOld.FilterInfo = new ColumnFilterInfo("[OldProgramNr]<>-1"); + if (this.subListIndex > 0) + this.colPrNr.FilterInfo = new ColumnFilterInfo("[NewProgramNr]<>-1"); + this.gviewRight.EndSort(); + } + + #endregion + + #region RefreshGrid() + + internal void RefreshGrids() + { + RefreshGrid(this.gviewLeft, this.gviewRight); + } + + private void RefreshGrid(params GridView[] grids) + { + foreach (var grid in grids) + { + grid.BeginDataUpdate(); + grid.EndDataUpdate(); + } + } + + #endregion + + #region Accessibility private void FocusRightList() { @@ -1744,39 +2464,11 @@ namespace ChanSort.Ui this.gridLeft.Focus(); } -#endregion - - // UI events - -#region MainForm_Load - private void MainForm_Load(object sender, EventArgs e) - { - this.TryExecute(this.LoadSettings); - this.TryExecute(this.InitAppAfterMainWindowWasShown); - } -#endregion - -#region ProcessCmdKey() - protected override bool ProcessCmdKey(ref Message msg, Keys keyData) - { - if (keyData == Keys.F1) - { - this.popupInputSource.ShowPopup(this.tabChannelList.PointToScreen(new Point(0, this.tabChannelList.Height))); - return true; - } - - if (keyData == (Keys.F1 | Keys.Shift)) - { - this.popupFavList.ShowPopup(this.tabSubList.PointToScreen(new Point(0, this.tabSubList.Height))); - return true; - } - return base.ProcessCmdKey(ref msg, keyData); - } -#endregion + #endregion // -- menus -#region File menu + #region File menu private void miOpen_ItemClick(object sender, ItemClickEventArgs e) { @@ -1840,12 +2532,12 @@ namespace ChanSort.Ui private void miRecentFiles_ListItemClick(object sender, ListItemClickEventArgs e) { - TryExecute(()=>this.LoadFiles(null, this.mruFiles[e.Index])); + TryExecute(() => this.LoadFiles(null, this.mruFiles[e.Index])); } -#endregion + #endregion -#region Edit menu + #region Edit menu private void miMoveDown_ItemClick(object sender, ItemClickEventArgs e) { @@ -1879,13 +2571,13 @@ namespace ChanSort.Ui private void miFavSet_ItemClick(object sender, ItemClickEventArgs e) { - string fav = e.Item.Tag as string; + var fav = e.Item.Tag as string; this.SetFavorite(fav, true); } private void miFavUnset_ItemClick(object sender, ItemClickEventArgs e) { - string fav = e.Item.Tag as string; + var fav = e.Item.Tag as string; this.SetFavorite(fav, false); } @@ -1918,43 +2610,24 @@ namespace ChanSort.Ui { this.TryExecute(() => this.SetChannelFlag(ch => ch.Hidden = false)); } -#endregion -#region Language menu - private void miLanguage_DownChanged(object sender, ItemClickEventArgs e) - { - try - { - if (this.ignoreLanguageChange) - return; - BarButtonItem menuItem = (BarButtonItem)sender; - if (!menuItem.Down) - return; - if (!this.PromptSaveAndContinue()) - return; - string locale = (string)menuItem.Tag; - Program.ChangeLanguage = true; - Thread.CurrentThread.CurrentUICulture = new CultureInfo(locale); - this.Close(); - } - catch (Exception ex) { HandleException(ex); } - } -#endregion + #endregion + + #region TV-Set menu -#region TV-Set menu private void miTvCountrySetup_ItemClick(object sender, ItemClickEventArgs e) { this.TryExecute(this.ShowTvCountrySettings); } - + private void miCleanupChannels_ItemClick(object sender, ItemClickEventArgs e) { this.TryExecute(this.CleanupChannelData); } -#endregion + #endregion -#region Character set menu + #region Character set menu private void miIsoCharSets_ListItemClick(object sender, ListItemClickEventArgs e) { @@ -1970,9 +2643,10 @@ namespace ChanSort.Ui { SetDefaultEncoding(e.Encoding); } -#endregion -#region Help menu + #endregion + + #region Help menu private void miWiki_ItemClick(object sender, ItemClickEventArgs e) { @@ -1986,11 +2660,12 @@ namespace ChanSort.Ui private void miAbout_ItemClick(object sender, ItemClickEventArgs e) { - TryExecute(() => new AboutForm(this.plugins).ShowDialog()); + TryExecute(() => new AboutForm(this.Plugins).ShowDialog()); } -#endregion -#region Accessibility menu + #endregion + + #region Accessibility menu private void miInputSource_ItemClick(object sender, ItemClickEventArgs e) { @@ -2001,11 +2676,14 @@ namespace ChanSort.Ui { try { - int idx = Convert.ToInt32(e.Item.Tag); + var idx = Convert.ToInt32(e.Item.Tag); if (this.grpSubList.Visible && idx < this.tabSubList.TabPages.Count) this.tabSubList.SelectedTabPageIndex = idx; } - catch (Exception ex) { HandleException(ex); } + catch (Exception ex) + { + HandleException(ex); + } } private void miGotoLeftFilter_ItemClick(object sender, ItemClickEventArgs e) @@ -2028,61 +2706,16 @@ namespace ChanSort.Ui TryExecute(this.FocusRightList); } -#endregion + #endregion - // -- controls - -#region picDonate_Click - private void picDonate_Click(object sender, EventArgs e) - { - BrowserHelper.OpenHtml(Resources.paypal_button); - } -#endregion - -#region tabChannelList_SelectedPageChanged - private void tabChannelList_SelectedPageChanged(object sender, TabPageChangedEventArgs e) - { - this.TryExecute(() => ShowChannelList(e.Page == null ? null : (ChannelList)e.Page.Tag)); - } -#endregion - -#region tabSubList_SelectedPageChanged - private void tabSubList_SelectedPageChanged(object sender, TabPageChangedEventArgs e) - { - this.subListIndex = this.tabSubList.SelectedTabPageIndex; - this.ShowGridColumns(this.gviewRight); - - this.editor.SubListIndex = this.subListIndex; - this.gviewLeft.BeginSort(); - this.gviewLeft.EndSort(); - this.gviewRight.BeginSort(); - if (this.subListIndex > 0) - this.colPrNr.FilterInfo = new ColumnFilterInfo("[NewProgramNr]<>-1"); - else - this.colPrNr.ClearFilter(); - this.gviewRight.EndSort(); - } -#endregion - -#region gview_CustomUnboundColumnData - private void gview_CustomUnboundColumnData(object sender, CustomColumnDataEventArgs e) - { - var channel = (ChannelInfo) e.Row; - if (e.Column.FieldName == "Position") - e.Value = channel.GetPosition(this.subListIndex); - else if (e.Column.FieldName == "OldPosition") - e.Value = channel.GetOldPosition(this.subListIndex); - } -#endregion - -#region gview_MouseDown, gview_MouseUp, timerEditDelay_Tick, gview_ShowingEditor + #region gview_MouseDown, gview_MouseUp, timerEditDelay_Tick, gview_ShowingEditor // these 4 event handler in combination override the default row-selection and editor-opening // behavior of the grid control. private void gview_MouseDown(object sender, MouseEventArgs e) { - GridView view = (GridView)sender; + var view = (GridView) sender; this.downHit = view.CalcHitInfo(e.Location); this.dragDropInfo = null; if (!view.IsDataRow(downHit.RowHandle)) @@ -2100,7 +2733,7 @@ namespace ChanSort.Ui if (ModifierKeys == Keys.Control && !view.IsRowSelected(downHit.RowHandle)) this.BeginInvoke((Action) (() => view.SelectRow(downHit.RowHandle))); } - } + } else if (e.Button == MouseButtons.Right) { if (!view.IsRowSelected(downHit.RowHandle)) @@ -2128,282 +2761,36 @@ namespace ChanSort.Ui } } - private void gview_ShowingEditor(object sender, System.ComponentModel.CancelEventArgs e) + private void gview_ShowingEditor(object sender, CancelEventArgs e) { var field = ((GridView) sender).FocusedColumn.FieldName; if (this.dontOpenEditor && (field == this.colSlotNew.FieldName || field == this.colName.FieldName)) e.Cancel = true; } -#endregion -#region gview_ShownEditor, gview_KeyPress + #endregion + + #region gview_ShownEditor, gview_KeyPress private void gview_ShownEditor(object sender, EventArgs e) { - GridView view = (GridView)sender; - TextEdit edit = view.ActiveEditor as TextEdit; + var view = (GridView) sender; + var edit = view.ActiveEditor as TextEdit; if (edit == null) return; - edit.Properties.MaxLength = view.FocusedColumn.FieldName == "Name" ? this.currentChannelList.MaxChannelNameLength : 0; + edit.Properties.MaxLength = view.FocusedColumn.FieldName == "Name" ? this.CurrentChannelList.MaxChannelNameLength : 0; } private void gview_KeyPress(object sender, KeyPressEventArgs e) { - var view = (GridView)sender; + var view = (GridView) sender; if (view.FocusedColumn.DisplayFormat.FormatType == FormatType.Numeric && (e.KeyChar < '0' || e.KeyChar > '9')) e.Handled = true; } -#endregion -#region gview_MouseMove - private void gview_MouseMove(object sender, MouseEventArgs e) - { - try - { - var view = (GridView)sender; - if (this.downHit == null || downHit.RowHandle < 0 || e.Button != MouseButtons.Left || view.ActiveEditor != null || ModifierKeys != Keys.None) - return; - if (this.currentChannelList == null || this.currentChannelList.ReadOnly) - return; - // drag/drop only allowed when left grid is sorted by NewSlotNr - if (!this.IsLeftGridSortedByNewProgNr) - return; - if (Math.Abs(e.Y - downHit.HitPoint.Y) < SystemInformation.DragSize.Height && - Math.Abs(e.X - downHit.HitPoint.X) < SystemInformation.DragSize.Width) - return; + #endregion - // start drag operation - var channel = (ChannelInfo)view.GetRow(downHit.RowHandle); - this.dragDropInfo = new DragDropInfo(view, channel.GetPosition(this.subListIndex)); - view.GridControl.DoDragDrop(this.dragDropInfo, DragDropEffects.Move); - this.downHit = null; - } - catch (Exception ex) { HandleException(ex); } - } -#endregion + #region gviewLeft_LayoutUpgrade, gviewRight_LayoutUpgrade -#region grid_GiveFeedback - private void grid_GiveFeedback(object sender, GiveFeedbackEventArgs e) - { - // this event is called on the source of the drag operation - e.UseDefaultCursors = false; - if (e.Effect == DragDropEffects.Move) - { - if (this.dragDropInfo.EditMode == EditMode.InsertBefore) - Cursor.Current = Cursors.PanNE; - else if (this.dragDropInfo.EditMode == EditMode.InsertAfter) - Cursor.Current = Cursors.PanSE; - else - Cursor.Current = Cursors.HSplit; - } - else if (sender == this.gridRight) - Cursor.Current = Cursors.PanWest; - else - Cursor.Current = Cursors.No; - } -#endregion - -#region gridLeft_DragOver - private void gridLeft_DragOver(object sender, DragEventArgs e) - { - if (this.dragDropInfo == null) // drag operation from outside ChanSort - return; - - // this event is called on the current target of the drag operation - var point = this.gridLeft.PointToClient(MousePosition); - var hit = this.gviewLeft.CalcHitInfo(point); - if (hit.RowHandle >= 0) - { - var vi = (DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo)this.gviewLeft.GetViewInfo(); - var rowInfo = vi.GetGridRowInfo(hit.RowHandle); - ChannelInfo dropChannel = (ChannelInfo)this.gviewLeft.GetRow(hit.RowHandle); - bool moveUp = this.dragDropInfo.SourcePosition < 0 || dropChannel.GetPosition(this.subListIndex) <= this.dragDropInfo.SourcePosition; - if (moveUp && point.Y < rowInfo.Bounds.Top + rowInfo.Bounds.Height / 2) - this.dragDropInfo.EditMode = EditMode.InsertBefore; - else if (!moveUp && point.Y > rowInfo.Bounds.Top + rowInfo.Bounds.Height / 2) - this.dragDropInfo.EditMode = EditMode.InsertAfter; - else if (this.dragDropInfo.SourceView == this.gviewLeft) - this.dragDropInfo.EditMode = EditMode.Swap; - else if (moveUp) - this.dragDropInfo.EditMode = EditMode.InsertAfter; - else - this.dragDropInfo.EditMode = EditMode.InsertBefore; - - this.dragDropInfo.DropRowHandle = hit.RowHandle; - e.Effect = DragDropEffects.Move; - return; - } - - e.Effect = DragDropEffects.None; - this.dragDropInfo.DropRowHandle = GridControl.InvalidRowHandle; - } -#endregion - -#region gridLeft_DragDrop - private void gridLeft_DragDrop(object sender, DragEventArgs e) - { - try - { - if (this.dragDropInfo.DropRowHandle < 0) return; - this.curEditMode = this.dragDropInfo.EditMode; - var dropChannel = (ChannelInfo)this.gviewLeft.GetRow(this.dragDropInfo.DropRowHandle); - - var selectedChannels = this.GetSelectedChannels(this.dragDropInfo.SourceView); - int newProgNr; - int dropPos = dropChannel.GetPosition(this.subListIndex); - if (this.dragDropInfo.EditMode != EditMode.InsertAfter || !this.cbCloseGap.Checked) - newProgNr = dropPos; - else - { - int numberOfChannelsToMoveDown = 0; - foreach (var channel in selectedChannels) - { - int curPos = channel.GetPosition(this.subListIndex); - if (curPos != -1 && curPos <= dropPos) - ++numberOfChannelsToMoveDown; - } - newProgNr = dropPos + 1 - numberOfChannelsToMoveDown; - } - - this.editor.SetSlotNumber(selectedChannels, newProgNr, this.dragDropInfo.EditMode == EditMode.Swap, this.cbCloseGap.Checked); - this.RefreshGrid(this.gviewLeft, this.gviewRight); - } - catch (Exception ex) - { - HandleException(ex); - } - } -#endregion - -#region gridLeft_ProcessGridKey - private void gridLeft_ProcessGridKey(object sender, KeyEventArgs e) - { - if (this.currentChannelList != null && this.currentChannelList.ReadOnly) - return; - if (gviewLeft.ActiveEditor != null) - return; - if (e.KeyCode == Keys.Delete) - TryExecute(() => this.RemoveChannels(this.gviewLeft, this.cbCloseGap.Checked)); - else if (e.KeyCode == Keys.Add) - TryExecute(() => this.MoveChannels(false)); - else if (e.KeyCode == Keys.Subtract) - TryExecute(() => this.MoveChannels(true)); - else - return; - e.Handled = true; - e.SuppressKeyPress = true; - } -#endregion - -#region gviewLeft_FocusedRowChanged - - private void gviewLeft_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e) - { - TryExecute(UpdateInsertSlotNumber); - } - -#endregion - -#region gviewLeft_SelectionChanged - private void gviewLeft_SelectionChanged(object sender, DevExpress.Data.SelectionChangedEventArgs e) - { - this.UpdateMenu(); - } -#endregion - -#region gviewLeft_CustomColumnDisplayText - private void gviewLeft_CustomColumnDisplayText(object sender, CustomColumnDisplayTextEventArgs e) - { - if (e.Column == this.colOutFav) - { - if (!(e.Value is Favorites)) return; - if ((Favorites)e.Value == 0) - e.DisplayText = string.Empty; - } - } -#endregion - -#region gviewLeft_RowCellStyle - private void gviewLeft_RowCellStyle(object sender, RowCellStyleEventArgs e) - { - var channel = (ChannelInfo)this.gviewLeft.GetRow(e.RowHandle); - if (channel == null) return; - if (channel.OldProgramNr == -1) - { - e.Appearance.ForeColor = Color.Red; - e.Appearance.Options.UseForeColor = true; - } - else if (channel.Hidden) - { - e.Appearance.ForeColor = Color.LightGray; - e.Appearance.Options.UseForeColor = true; - } - else if (channel.Skip) - { - e.Appearance.ForeColor = Color.Blue; - e.Appearance.Options.UseForeColor = true; - } - } -#endregion - -#region gviewLeft_ValidatingEditor - private void gviewLeft_ValidatingEditor(object sender, BaseContainerValidateEditorEventArgs e) - { - try - { - if (gviewLeft.FocusedRowHandle == GridControl.AutoFilterRowHandle) - return; - if (this.gviewLeft.FocusedColumn == this.colOutSlot && e.Value is string) - e.Valid = this.SetSlotNumber((string)e.Value); - else if (this.gviewLeft.FocusedColumn == this.colOutFav && e.Value is string) - e.Value = ChannelInfo.ParseFavString((string)e.Value); - else if (gviewLeft.FocusedColumn == this.colOutName) - { - this.VerifyChannelNameModified(this.gviewLeft.GetFocusedRow() as ChannelInfo, e.Value as string); - this.BeginInvoke((Action)(() => RefreshGrid(this.gviewLeft))); - } - dataRoot.NeedsSaving = true; - } - catch (Exception ex) { HandleException(ex); } - } -#endregion - -#region gviewLeft_CellValueChanged - private void gviewLeft_CellValueChanged(object sender, CellValueChangedEventArgs e) - { - this.gviewRight.BeginDataUpdate(); - this.gviewRight.EndDataUpdate(); - } -#endregion - -#region gviewLeft_PopupMenuShowing - private void gviewLeft_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) - { - this.lastFocusedGrid = this.gviewLeft; - this.UpdateMenu(); - if (e.MenuType == GridMenuType.Row && e.HitInfo.InRow && this.gviewLeft.IsDataRow(e.HitInfo.RowHandle)) - this.popupContext.ShowPopup(this.gridLeft.PointToScreen(e.Point)); - } -#endregion - -#region gviewLeft_RowClick - private void gviewLeft_RowClick(object sender, RowClickEventArgs e) - { - if (e.Clicks == 2 && e.Button == MouseButtons.Left && this.gviewLeft.IsDataRow(e.RowHandle)) - { - ChannelInfo channel = (ChannelInfo)this.gviewLeft.GetRow(e.RowHandle); - this.NavigateToChannel(channel, this.gviewRight); - } - } -#endregion - -#region gviewLeft_EndSorting - private void gviewLeft_EndSorting(object sender, EventArgs e) - { - TryExecute(this.UpdateMenu); - } -#endregion - -#region gviewLeft_LayoutUpgrade, gviewRight_LayoutUpgrade private void gviewLeft_LayoutUpgrade(object sender, LayoutUpgradeEventArgs e) { this.gviewLeft.ClearGrouping(); @@ -2415,134 +2802,11 @@ namespace ChanSort.Ui this.gviewRight.ClearGrouping(); this.gviewRight.OptionsCustomization.AllowGroup = false; } -#endregion -#region gridRight_ProcessGridKey - private void gridRight_ProcessGridKey(object sender, KeyEventArgs e) - { - if (this.gviewRight.ActiveEditor != null) - return; - if (e.KeyCode == Keys.Enter && this.currentChannelList != null && !this.currentChannelList.ReadOnly) - { - TryExecute(this.AddChannels); - e.Handled = true; - } - } + #endregion -#endregion + #region btnClearLeftFilter_Click, btnClearRightFilter_Click -#region gviewRight_FocusedRowChanged - private void gviewRight_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e) - { - this.gviewRight.SelectRow(e.FocusedRowHandle); - } -#endregion - -#region gviewRight_CustomColumnDisplayText - private void gviewRight_CustomColumnDisplayText(object sender, CustomColumnDisplayTextEventArgs e) - { - if (e.Column == this.colSlotNew || e.Column == this.colSlotOld || e.Column == this.colPrNr) - { - if (!(e.Value is int)) return; - if ((int) e.Value == -1) - e.DisplayText = string.Empty; - } - else if (e.Column == this.colFavorites) - { - if (!(e.Value is Favorites)) return; - if ((Favorites) e.Value == 0) - e.DisplayText = string.Empty; - } - } -#endregion - -#region gviewRight_RowCellStyle - private void gviewRight_RowCellStyle(object sender, RowCellStyleEventArgs e) - { - ChannelInfo channel = (ChannelInfo)this.gviewRight.GetRow(e.RowHandle); - if (channel == null) return; - if (channel.OldProgramNr == -1) - { - e.Appearance.ForeColor = Color.Red; - e.Appearance.Options.UseForeColor = true; - } - else if (channel.GetPosition(this.subListIndex) != -1) - { - e.Appearance.ForeColor = Color.Gray; - e.Appearance.Options.UseForeColor = true; - } - } -#endregion - -#region gviewRight_RowClick - private void gviewRight_RowClick(object sender, RowClickEventArgs e) - { - if (e.Clicks == 2 && e.Button == MouseButtons.Left && this.gviewRight.IsDataRow(e.RowHandle)) - TryExecute(this.AddChannels); - } -#endregion - -#region gviewRight_ValidatingEditor - private void gviewRight_ValidatingEditor(object sender, BaseContainerValidateEditorEventArgs e) - { - try - { - if (gviewRight.FocusedRowHandle == GridControl.AutoFilterRowHandle) - return; - if (this.gviewRight.FocusedColumn == this.colSlotNew && e.Value is string) - e.Valid = this.SetSlotNumber((string)e.Value); - else if (this.gviewRight.FocusedColumn == this.colFavorites && e.Value is string) - e.Value = ChannelInfo.ParseFavString((string)e.Value); - else if (gviewRight.FocusedColumn == this.colName) - { - var ci = this.gviewRight.GetFocusedRow() as ChannelInfo; - this.VerifyChannelNameModified(ci, e.Value as string); - //this.BeginInvoke((Action) (() => RefreshGrid(this.gviewLeft))); - } - dataRoot.NeedsSaving = true; - } catch(Exception ex) { HandleException(ex); } - } -#endregion - -#region gviewRight_CellValueChanged - private void gviewRight_CellValueChanged(object sender, CellValueChangedEventArgs e) - { - TryExecute(() => RefreshGrid(this.gviewLeft)); - } -#endregion - -#region gviewRight_PopupMenuShowing - private void gviewRight_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e) - { - this.lastFocusedGrid = this.gviewRight; - this.UpdateMenu(); - if (e.MenuType == GridMenuType.Row) - this.popupContext.ShowPopup(this.gridRight.PointToScreen(e.Point)); - } -#endregion - - -#region rbInsertMode_CheckedChanged - private void rbInsertMode_CheckedChanged(object sender, EventArgs e) - { - if (!((CheckEdit)sender).Checked) - return; - try - { - if (this.currentChannelList == null) - return; - int delta = this.curEditMode == EditMode.InsertAfter ? -1 : - this.rbInsertAfter.Checked ? +1 : 0; - this.currentChannelList.InsertProgramNumber += delta; - this.UpdateInsertSlotTextBox(); - this.curEditMode = this.rbInsertBefore.Checked ? EditMode.InsertBefore - : this.rbInsertAfter.Checked ? EditMode.InsertAfter - : EditMode.Swap; - } catch(Exception ex) { HandleException(ex); } - } -#endregion - -#region btnClearLeftFilter_Click, btnClearRightFilter_Click private void btnClearLeftFilter_Click(object sender, EventArgs e) { TryExecute(this.ClearLeftFilter); @@ -2552,17 +2816,10 @@ namespace ChanSort.Ui { TryExecute(this.ClearRightFilter); } -#endregion -#region btnAdd_Click + #endregion - private void btnAdd_Click(object sender, EventArgs e) - { - TryExecute(this.AddChannels); - } -#endregion - -#region btnRemoveLeft_Click, btnRemoveRight_Click + #region btnRemoveLeft_Click, btnRemoveRight_Click private void btnRemoveLeft_Click(object sender, EventArgs e) { @@ -2573,9 +2830,10 @@ namespace ChanSort.Ui { this.TryExecute(() => this.RemoveChannels(this.gviewRight, this.cbCloseGap.Checked)); } -#endregion -#region btnUp_Click, btnDown_Click + #endregion + + #region btnUp_Click, btnDown_Click private void btnUp_Click(object sender, EventArgs e) { @@ -2587,22 +2845,10 @@ namespace ChanSort.Ui TryExecute(() => MoveChannels(false)); } -#endregion + #endregion -#region txtSetSlot_EditValueChanged - private void txtSetSlot_EditValueChanged(object sender, EventArgs e) - { - TryExecute(() => - { - int nr; - int.TryParse(this.txtSetSlot.Text, out nr); - if (this.currentChannelList != null) - this.currentChannelList.InsertProgramNumber = nr; - }); - } -#endregion + #region txtSetSlot_ButtonClick, txtSetSlot_KeyDown -#region txtSetSlot_ButtonClick, txtSetSlot_KeyDown private void txtSetSlot_ButtonClick(object sender, ButtonPressedEventArgs e) { TryExecute(() => this.SetSlotNumber(this.txtSetSlot.Text)); @@ -2616,36 +2862,14 @@ namespace ChanSort.Ui e.Handled = true; } } -#endregion -#region btnRenum_Click - private void btnRenum_Click(object sender, EventArgs e) - { - TryExecute(this.RenumberSelectedChannels); - } -#endregion + #endregion -#region MainForm_FormClosing - private void MainForm_FormClosing(object sender, FormClosingEventArgs e) - { - if (this.PromptSaveAndContinue()) - this.SaveSettings(); - else - e.Cancel = true; - } -#endregion + #region btnToggleFav_Click, btnToggleLock_Click -#region btnAddAll_Click - private void btnAddAll_Click(object sender, EventArgs e) - { - this.TryExecute(this.AddAllUnsortedChannels); - } -#endregion - -#region btnToggleFav_Click, btnToggleLock_Click private void btnToggleFav_Click(object sender, EventArgs e) { - string fav = ((Control) sender).Text.Substring(1); + var fav = ((Control) sender).Text.Substring(1); this.TryExecute(() => this.ToggleFavorite(fav)); } @@ -2653,9 +2877,11 @@ namespace ChanSort.Ui { this.TryExecute(this.ToggleLock); } -#endregion -#region grpOutputList_Enter, grpInputList_Enter + #endregion + + #region grpOutputList_Enter, grpInputList_Enter + private void grpOutputList_Enter(object sender, EventArgs e) { this.SetActiveGrid(this.gviewLeft); @@ -2665,26 +2891,7 @@ namespace ChanSort.Ui { this.SetActiveGrid(this.gviewRight); } -#endregion -#region miRenumFavByPrNr_ItemClick - private void miRenumFavByPrNr_ItemClick(object sender, ItemClickEventArgs e) - { - TryExecute(this.editor.ApplyPrNrToFavLists); - this.RefreshGrid(this.gviewLeft, this.gviewRight); - } - -#endregion - -#region miAllowEditPredefinedLists_DownChanged - private void miAllowEditPredefinedLists_DownChanged(object sender, ItemClickEventArgs e) - { - TryExecute(() => - { - this.UpdateGridReadOnly(); - this.UpdateMenu(); - }); - } -#endregion + #endregion } -} +} \ No newline at end of file