diff --git a/ChanSort.Api/Controller/Editor.cs b/ChanSort.Api/Controller/Editor.cs index fff1f3d..6b82b51 100644 --- a/ChanSort.Api/Controller/Editor.cs +++ b/ChanSort.Api/Controller/Editor.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Text; namespace ChanSort.Api { @@ -175,6 +176,49 @@ namespace ChanSort.Api #endregion + #region ApplyReferenceList() + public void ApplyReferenceList(DataRoot refDataRoot) + { + + foreach (var channelList in this.DataRoot.ChannelLists) + { + foreach (var channel in channelList.Channels) + channel.NewProgramNr = -1; + } + + StringBuilder log = new StringBuilder(); + foreach (var refList in refDataRoot.ChannelLists) + { + var tvList = this.DataRoot.GetChannelList(refList.SignalSource); + if (tvList == null) + { + log.AppendFormat("Skipped reference list {0}\r\n", refList.ShortCaption); + continue; + } + foreach (var refChannel in refList.Channels) + { + var tvChannels = tvList.GetChannelByUid(refChannel.Uid); + ChannelInfo tvChannel = tvChannels.FirstOrDefault(c => c.NewProgramNr == -1); + if (tvChannel != null) + { + tvChannel.NewProgramNr = refChannel.OldProgramNr; + tvChannel.Favorites = refChannel.Favorites; + tvChannel.Skip = refChannel.Skip; + tvChannel.Lock = refChannel.Lock; + tvChannel.Hidden = refChannel.Hidden; + tvChannel.IsDeleted = refChannel.IsDeleted; + } + else + { + tvChannel = new ChannelInfo(refChannel.SignalSource, refChannel.Uid, refChannel.OldProgramNr, refChannel.Name); + tvList.AddChannel(tvChannel); + } + } + } + } + + #endregion + #region AutoNumberingForUnassignedChannels() public void AutoNumberingForUnassignedChannels(UnsortedChannelMode mode) diff --git a/ChanSort.Api/Controller/SerializerBase.cs b/ChanSort.Api/Controller/SerializerBase.cs index 9781b9a..0fa886c 100644 --- a/ChanSort.Api/Controller/SerializerBase.cs +++ b/ChanSort.Api/Controller/SerializerBase.cs @@ -6,7 +6,6 @@ namespace ChanSort.Api { public class SupportedFeatures { - public bool EraseChannelData { get; set; } public bool ChannelNameEdit { get; set; } public bool FileInformation { get; set; } public bool CleanUpChannelData { get; set; } @@ -19,7 +18,6 @@ namespace ChanSort.Api public string FileName { get; set; } public DataRoot DataRoot { get; protected set; } public SupportedFeatures Features { get; private set; } - public bool EraseDuplicateChannels { get; set; } protected SerializerBase(string inputFile) { diff --git a/ChanSort.Loader.LG/ChanSort.Loader.LG.ini b/ChanSort.Loader.LG/ChanSort.Loader.LG.ini index 2724999..8ebc27c 100644 --- a/ChanSort.Loader.LG/ChanSort.Loader.LG.ini +++ b/ChanSort.Loader.LG/ChanSort.Loader.LG.ini @@ -259,7 +259,7 @@ offAudioPid2 = 154 [DvbsBlock:687880] - ; everything before LM series + LM611S and LM340S + ; everything before LM series + LM340S, LM611S, LS560S satCount = 64 satLength = 44 transponderCount = 2400 @@ -283,7 +283,7 @@ [DvbsBlock:717960] - ; LM and PM series except LM611S and LM340S + ; LM, LS and PM series except LM611S, LM340S LS560S satCount = 64 satLength = 44 transponderCount = 2400 @@ -304,6 +304,7 @@ lnbCount = 40 lnbLength = 52 + [TransponderDataMapping:40] ; everything up to LM offFirstChannelIndex = 0 @@ -315,7 +316,6 @@ offTransportStreamId = 20 offSymbolRate = 25 offSatIndex = 36 - symbolRateFactor = 1 [TransponderDataMapping:44] ; LN @@ -328,7 +328,6 @@ offTransportStreamId = 24 offSymbolRate = 29 offSatIndex = 40 - symbolRateFactor = 0.5 [TransponderDataMapping:56] ; LA @@ -341,7 +340,6 @@ offTransportStreamId = 24 offSymbolRate = 29 offSatIndex = 40 - symbolRateFactor = 0.5 [SatChannelDataMapping:68] ; everything before LM + LM340S and LM611S @@ -455,6 +453,12 @@ offVideoPid = 72 offAudioPid = 74 +[FirmwareData:6936] + ; LH3000 + offSize = 0 + offHotelModeEnabled=6539 + offHotelModeDtvUpdate=6549 + [FirmwareData:6944] ; LH series offSize = 0 @@ -485,6 +489,12 @@ offHotelModeEnabled=12639 offHotelModeDtvUpdate=12649 +[FirmwareData:17136] + ; LN + offSize = 0 + offHotelModeEnabled=13627 + offHotelModeDtvUpdate=13629 + [FirmwareData:23072] ; LD420, LD450, LD550 offSize = 0 diff --git a/ChanSort.Loader.LG/SatTransponder.cs b/ChanSort.Loader.LG/SatTransponder.cs index 587ecc1..da67dd2 100644 --- a/ChanSort.Loader.LG/SatTransponder.cs +++ b/ChanSort.Loader.LG/SatTransponder.cs @@ -35,7 +35,7 @@ namespace ChanSort.Loader.LG this.FrequencyInMhz = mapping.GetWord(_Frequency); this.OriginalNetworkId = mapping.GetWord(_OriginalNetworkId); this.TransportStreamId = mapping.GetWord(_TransportStreamId); - this.symbolRate = mapping.GetWord(_SymbolRate) & 0x7FFF; + this.symbolRate = mapping.GetWord(_SymbolRate); #if SYMBOL_RATE_ROUNDING if (this.symbolRate%100 >= 95) @@ -44,11 +44,8 @@ namespace ChanSort.Loader.LG mapping.SetWord(_SymbolRate, (mapping.GetWord(_SymbolRate) & 0x8000) + this.symbolRate); } #endif + // note: a correction factor is applied later after all transponders were loaded (*0.5, *1, *2) - string strFactor = mapping.Settings.GetString("symbolRateFactor"); - decimal factor; - if (!string.IsNullOrEmpty(strFactor) && decimal.TryParse(strFactor, NumberStyles.AllowDecimalPoint, NumberFormatInfo.InvariantInfo, out factor)) - this.symbolRate = (int)(this.symbolRate * factor); this.Satellite = dataRoot.Satellites.TryGet(mapping.GetByte(_SatIndex)/2); } @@ -88,8 +85,10 @@ namespace ChanSort.Loader.LG get { return symbolRate; } set { +#if false mapping.SetDataPtr(this.data, this.offset); mapping.SetWord(_SymbolRate, value); +#endif this.symbolRate = value; } } diff --git a/ChanSort.Loader.LG/TllFileSerializer.cs b/ChanSort.Loader.LG/TllFileSerializer.cs index de76bc0..8ec520a 100644 --- a/ChanSort.Loader.LG/TllFileSerializer.cs +++ b/ChanSort.Loader.LG/TllFileSerializer.cs @@ -1,6 +1,5 @@ //#define STORE_DVBS_CHANNELS_IN_DATABASE -//#define TESTING_LM640T_HACK - +//#define LM640T_EXPERIMENT using System; using System.Collections.Generic; using System.IO; @@ -64,12 +63,12 @@ namespace ChanSort.Loader.LG private int presetChannels; private bool removeDeletedActChannels = false; + private decimal dvbsSymbolRateFactor; #region ctor() public TllFileSerializer(string inputFile) : base(inputFile) { this.Features.ChannelNameEdit = true; - this.Features.EraseChannelData = true; this.Features.FileInformation = true; this.Features.DeviceSettings = true; this.Features.CleanUpChannelData = true; @@ -136,8 +135,10 @@ namespace ChanSort.Loader.LG this.ReadFirmwareDataBlock(ref off); this.ReadDvbCtChannels(ref off); this.ReadDvbSBlock(ref off); - this.ReadSettingsBlock(ref off); - this.CleanUpChannelData(); + this.ReadSettingsBlock(ref off); + + if (this.presetChannels > 0 && !IsTesting) + new PresetProgramNrDialog().ShowDialog(); #if STORE_DVBS_CHANNELS_IN_DATABASE this.StoreToDatabase(); @@ -295,17 +296,18 @@ namespace ChanSort.Loader.LG long blockId = BitConverter.ToInt64(fileContent, off + 8); if (blockId == DVBS_S2) return true; - +#if LM640T_EXPERIMENT if (blockId == -1) { this.satConfig = satConfigs.TryGet(blockSize); if (this.satConfig != null) { this.EraseDvbsBlock(off); - this.UpdateDvbsChecksums(); + return true; } } +#endif return false; } #endregion @@ -378,6 +380,8 @@ namespace ChanSort.Loader.LG #region ReadTransponderData() private void ReadTransponderData(ref int off) { + dvbsSymbolRateFactor = 1; + var dvbsSymbolRateMask = 0x7FFFF; var mapping = this.dvbsTransponderMappings.GetMapping(this.satConfig.transponderLength); for (int i=0; i /// The model LM640T has the whole DVB-S2 block filled with 0xFF bytes, including the checksums. /// When a file (even the originally saved one) is loaded back, the TV crashes and performs a factory reset. @@ -500,16 +513,10 @@ namespace ChanSort.Loader.LG // header this.dvbsSubblockCrcOffset[0] = (int)stream.Position; stream.Seek(4, SeekOrigin.Current); // skip CRC32 -#if TESTING_LM640T_HACK - stream.Write(Encoding.ASCII.GetBytes("DVBS-S2\0"), 0, 8); - //stream.Write(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, 0, 8); - wrt.Write((ushort)0); - wrt.Write((ushort)0); -#else stream.Write(Encoding.ASCII.GetBytes("DVBS-S2\0"), 0, 8); wrt.Write((ushort) 7); wrt.Write((ushort) 4); -#endif + // satellite this.dvbsSubblockCrcOffset[1] = (int)stream.Position; stream.Seek(4, SeekOrigin.Current); // skip CRC32 @@ -545,7 +552,7 @@ namespace ChanSort.Loader.LG stream.Seek(12 + satConfig.dvbsMaxChannelCount/8, SeekOrigin.Current); wrt.Write((short) -1); wrt.Write((short) -1); - stream.Seek(4 + (satConfig.dvbsMaxChannelCount - 1)*8, SeekOrigin.Current); + stream.Seek(4 + (satConfig.dvbsMaxChannelCount - 1)*8 + satConfig.linkedListExtraDataLength, SeekOrigin.Current); for (int i = 0; i < satConfig.dvbsMaxChannelCount*satConfig.dvbsChannelLength; i++) wrt.Write((byte) 0xFF); @@ -556,7 +563,10 @@ namespace ChanSort.Loader.LG wrt.Write((byte) 1); stream.Seek(satConfig.lnbCount/8 - 1, SeekOrigin.Current); } + + this.UpdateDvbsChecksums(); } +#endif #endregion // Sat channel list cleanup ================== @@ -567,21 +577,14 @@ namespace ChanSort.Loader.LG if (this.satConfig == null) return ""; - if (!this.EraseDuplicateChannels || this.satConfig.dvbsChannelLength >= 92 /* LA series */) - { - if (this.presetChannels > 0 && !IsTesting) - { - new PresetProgramNrDialog().ShowDialog(); - } - return ""; - } - + this.DataRoot.NeedsSaving = true; this.ResetChannelInformationInTransponderData(); byte[] sortedChannels = new byte[this.satConfig.dvbsMaxChannelCount*this.satConfig.dvbsChannelLength]; var channelsByTransponder = this.satTvChannels.Channels.Union(this.satRadioChannels.Channels).OrderBy(PhysicalChannelOrder).ToList(); + int originalChannelCount = this.dvbsChannelCount; int prevChannelOrderId = -1; int prevTransponderIndex = -1; int channelCounter = 0; @@ -602,15 +605,19 @@ namespace ChanSort.Loader.LG } // copy temp data back to fileContent and clear remainder - Tools.MemCopy(sortedChannels, 0, - this.fileContent, this.dvbsBlockOffset + satConfig.ChannelListOffset, - channelCounter*satConfig.dvbsChannelLength); - Tools.MemSet(this.fileContent, - this.dvbsBlockOffset + satConfig.ChannelListOffset + channelCounter*satConfig.dvbsChannelLength, 0xFF, - (satConfig.dvbsMaxChannelCount - channelCounter)*satConfig.dvbsChannelLength); - + if (originalChannelCount != 0) // even if there's 0 channels, channel[0] must contain valid data + { + Tools.MemCopy(sortedChannels, 0, + this.fileContent, this.dvbsBlockOffset + satConfig.ChannelListOffset, + channelCounter*satConfig.dvbsChannelLength); + Tools.MemSet(this.fileContent, + this.dvbsBlockOffset + satConfig.ChannelListOffset + channelCounter*satConfig.dvbsChannelLength, + 0xFF, + (satConfig.dvbsMaxChannelCount - channelCounter)*satConfig.dvbsChannelLength); + } UpdateChannelAllocationBitmap(channelCounter); - UpdateChannelLinkedList(channelCounter); + UpdateChannelLinkedList(channelCounter); + UpdateDvbsChecksums(); return string.Format("{0} duplicate channels were detected and removed", removedCounter); } @@ -993,7 +1000,7 @@ namespace ChanSort.Loader.LG internal int ACTChannelLength { get { return this.actChannelSize; } } internal bool HasDvbs { get { return dvbsBlockOffset != 0; } } internal int SatChannelLength { get { return satConfig != null ? satConfig.dvbsChannelLength : 0; } } - internal bool SatSymbolRateDiv2 { get { return this.isDvbsSymbolRateDiv2; } } + internal decimal DvbsSymbolRateCorrectionFactor { get { return this.dvbsSymbolRateFactor; } } internal int FirmwareBlockSize { get { return this.firmwareBlockSize; } } } } diff --git a/ChanSort/GlobalImageCollection.cs b/ChanSort/GlobalImageCollection.cs index 7c2cecb..11c62e1 100644 --- a/ChanSort/GlobalImageCollection.cs +++ b/ChanSort/GlobalImageCollection.cs @@ -52,6 +52,40 @@ namespace ChanSort.Ui // // this.sharedImageCollection1.ImageSource.ImageStream = ((DevExpress.Utils.ImageCollectionStreamer)(resources.GetObject("sharedImageCollection1.ImageSource.ImageStream"))); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(0, "0000.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(1, "0001.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(2, "0002.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(3, "0003.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(4, "0004.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(5, "0005.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(6, "0006.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(7, "0007.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(8, "0008.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(9, "0009.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(10, "0010.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(11, "0011.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(12, "0012.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(13, "0013.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(14, "0014.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(15, "0015.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(16, "0016.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(17, "0017.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(18, "0018.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(19, "0019.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(20, "0020.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(21, "0021.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(22, "0022.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(23, "0023.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(24, "0024.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(25, "0025.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(26, "0026.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(27, "0027.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(28, "0028.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(29, "0029.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(30, "0030.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(31, "0031.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(32, "0032.png"); + this.sharedImageCollection1.ImageSource.Images.SetKeyName(33, "0033.png"); this.sharedImageCollection1.ParentControl = null; ((System.ComponentModel.ISupportInitialize)(this.sharedImageCollection1)).EndInit(); diff --git a/ChanSort/GlobalImageCollection.resx b/ChanSort/GlobalImageCollection.resx index 5a0d748..94ce614 100644 --- a/ChanSort/GlobalImageCollection.resx +++ b/ChanSort/GlobalImageCollection.resx @@ -129,7 +129,7 @@ a2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAAChEZXZFeHByZXNzLlV0aWxzLkltYWdlQ29sbGVjdGlvblN0 cmVhbWVyAgAAAAlJbWFnZVNpemUERGF0YQQHE1N5c3RlbS5EcmF3aW5nLlNpemUDAAAAAgIAAAAF/P// /xNTeXN0ZW0uRHJhd2luZy5TaXplAgAAAAV3aWR0aAZoZWlnaHQAAAgIAwAAABAAAAAQAAAACQUAAAAP - BQAAAIdfAAACDgMAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAARnQU1BAACxjwv8 + BQAAAEJlAAACDgMAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAARnQU1BAACxjwv8 YQUAAAAJcEhZcwAACukAAArpAf11ztMAAAAqdEVYdENyZWF0aW9uIFRpbWUATWkgMSBNcnogMjAwNiAx NToxMDo1MSArMDEwMP/NqUUAAAAHdElNRQfWAwEODCaDia/cAAACZ0lEQVQ4T82S7UsTUBSH75eCCAx6 oTAqg7BMRKjoQ6S9Oa1I10gzU8PUZmYpKEamy8gCX8iS2YxqiRmREMrUltEoLdSMps458wXUEiW0UToN @@ -175,373 +175,398 @@ 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 + qgzwtSqsOZbg9Xq3+eHCiqYGCxVpmLtWJHRY16SMbxd1+vlHY3m+NAb8iza43e4Aa45FfL9TDr40FtYa + JRwzVqHDl8TAoorhRZ2Q8RyZz5oXifleLRwOh8Dy13nM1ZXBqozEhDoX/OSEMGedL7TLHFEnRJ8l25zM + jcR0jxZ2ux3fpq2w1paAzUZLcmAbGxHmjBnaYXPmiDohuoOczZgtw9SzNkzTm6YungR7/lScDcugDjab + LQDrGHNkYI6oE/IhVfpkNEsG41kVzNXFGM2Uof9EJgzdWpjN5gATJhPGywvBuswRdUJeJUgSdBmcd4SK + Bkrv8Qz0v3uL4eFhAb1eDwPFeL9R2NPbvcwRdX9eJ0muDKRxW0MKDiOVxTB2PMf44IAfeh67cApsp1Nw + W29oV9T+yp7H0eGarmTppk5Oi0nBSMFmXXLp5qPo8Gba3etXtrOLIqEcUoSG3HsQFTb2Mj5i432i5Dej + Iy7C0xIVZkoNDWFyAYUTnR1hv20YJZqi2E1fSMljZ8o+Sjgl6Ncm5A/bkrJR5FyPOwAAAABJRU5ErkJg + ggEGAACJUE5HDQoaCgAAAA1JSERSAAAAEAAAABAIBgAAAB/z/2EAAAABc1JHQgCuzhzpAAAABGdBTUEA + ALGPC/xhBQAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMiaVRYdFhNTDpjb20u + YWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6 + a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBY + TVAgQ29yZSA1LjAtYzA2MSA2NC4xNDA5NDksIDIwMTAvMTIvMDctMTA6NTc6MDEgICAgICAgICI+IDxy + ZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5z + IyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2Jl + LmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8i + IHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYj + IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUuMSBXaW5kb3dzIiB4bXBNTTpJbnN0 + YW5jZUlEPSJ4bXAuaWlkOjY0NUE1REMxNTU2NTExRTE5RDM5RkJDNzU2REE4OUIwIiB4bXBNTTpEb2N1 + bWVudElEPSJ4bXAuZGlkOjY0NUE1REMyNTU2NTExRTE5RDM5RkJDNzU2REE4OUIwIj4gPHhtcE1NOkRl + cml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NjQ1QTVEQkY1NTY1MTFFMTlEMzlGQkM3 + NTZEQTg5QjAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NjQ1QTVEQzA1NTY1MTFFMTlEMzlGQkM3 + NTZEQTg5QjAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBh + Y2tldCBlbmQ9InIiPz6kllk2AAACWElEQVQ4T21SS2sTYRT9oHsXQmnMaxKSFlGySNqkj6Sp+IjWWBrB + pFqhT0WhhWgNamIzpmqhZBFUCBV1pxvrzoVWrcbHRnSjon/CtWjTao/3TCexFi8c7pzHPZPAqM3jdrvL + mqb9dDqdcDgc4CanbkbqA8B8kvF4PDGGk8kk8vk8isViHeTU6TNnnvwtEPG4x9OM8xcuIndJx+j4aRwd + HKmDnDp95mol9QKr3Y0zGR2nJrNIJEeRODKO+OET6E2cNHa/8ERqzPCZY553RoHT5S339g9jebEBj9IK + V/cqzAiwpPB7UfZzhcIehWsxhduDCtWnDWCed0aBxday/Hi+E3ihcK9cRuXjN0xnprAqBd+fyMEzhaWl + Bej6TdyfvwW8VGDeYmteNgoat7UAHxTWXsvbVirITswgM7gPv94q/KgorIh+bvgYspNXgNVXWHsjufcK + jZZmuecvsHrw8O441t6J8UnwRfBV8Nnk3OTUhTO3cGcMLdv96wV2hwuzczcQCMXQ2n4QbR1xwSFBn/A+ + 85la3PCZm527DptdWy/QNFdV1ws4sD+OSNcuRCO7Ee3+D0Snz5yuX+bHVTUK5Gt7kEqlMHV2Ch3BdoQ7 + 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 - g+2dl2inKs+nS+HSRZ0Q85HE9oWqDPC1Kqw5luD1erf54cKKpgYLFWmYu1YkdFjXpIxvF3X6+Udjeb40 - BvyLNrjd7gBrjkV8v1MOvjQW1holHDNWocOXxMCiiuFFnZDxHJnPmheJ+V4tHA6HwPLXeczVlcGqjMSE - Ohf85IQwZ50vtMscUSdEnyXbnMyNxHSPFna7Hd+mrbDWloDNRktyYBsbEeaMGdphc+aIOiG6g5zNmC3D - 1LM2TNObpi6eBHv+VJwNy6AONpstAOsYc2RgjqgT8iFV+mQ0SwbjWRXM1cUYzZSh/0QmDN1amM3mABMm - E8bLC8G6zBF1Ql4lSBJ0GZx3hIoGSu/xDPS/e4vh4WEBvV4PA8V4v1HY09u9zBF1f14nSa4MpHFbQwoO - I5XFMHY8x/jggB96HrtwCmynU3Bbb2hX1P7KnsfR4ZquZOmmTk6LScFIwWZdcunmo+jwZtrd61e2s4si - oRxShIbcexAVNvYyPmLjfaLkN6MjLsLTEhVmSg0NYXIBhROdHWG/bRglmqLYTV9IyWNnyj5KOCXo1ybk - D9uSslHkXI87AAAAAElFTkSuQmCCAQYAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAA - AAFzUkdCAK7OHOkAAAAEZ0FNQQAAsY8L/GEFAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5 - ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0i - VzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0 - YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0x - MDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5 - LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6 - eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFk - b2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu - MC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4x - IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NjQ1QTVEQzE1NTY1MTFFMTlEMzlGQkM3 - NTZEQTg5QjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NjQ1QTVEQzI1NTY1MTFFMTlEMzlGQkM3 - NTZEQTg5QjAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2NDVB - NURCRjU1NjUxMUUxOUQzOUZCQzc1NkRBODlCMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2NDVB - NURDMDU1NjUxMUUxOUQzOUZCQzc1NkRBODlCMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRG - PiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqSWWTYAAAJYSURBVDhPbVJLaxNhFP2gexdC - acxrEpIWUbJI2qSPpKn4iNZYGsGkWqFPRaGFaA1qYjOmaqFkEVQIFXWnG+vOhVatxsdGdKOif8K1aNNq - j/dMJ7EWLxzunMc9k8CozeN2u8uapv10Op1wOBzgJqduRuoDwHyS8Xg8MYaTySTy+TyKxWId5NTpM2ee - /C0Q8bjH04zzFy4id0nH6PhpHB0cqYOcOn3maiX1AqvdjTMZHacms0gkR5E4Mo744RPoTZw0dr/wRGrM - 8JljnndGgdPlLff2D2N5sQGP0gpX9yrMCLCk8HtR9nOFwh6FazGF24MK1acNYJ53RoHF1rL8eL4TeKFw - r1xG5eM3TGemsCoF35/IwTOFpaUF6PpN3J+/BbxUYN5ia142Chq3tQAfFNZey9tWKshOzCAzuA+/3ir8 - qCisiH5u+Biyk1eA1VdYeyO59wqNlma55y+wevDw7jjW3onxSfBF8FXw2eTc5NSFM7dwZwwt2/3rBXaH - C7NzNxAIxdDafhBtHXHBIUGf8D7zmVrc8JmbnbsOm11bL9A0V1XXCziwP45I1y5EI7sR7f4PRKfPnK5f - 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 + 7g+8a9yBp7ig185swuPUetySXfBJ20lwpoaNiRtYFq/A/rgdNkefQ65diqfWk86uzkffODU1ZSioLmjZ + rPPAzeCCi/5FVic543R8GQ5R9tjF2GITK4Ixcqy11riHuZNXmsfg4KDUicUeCAOWAeHEF5/KXCPXoIxb + wXKdIw5x9tjG2vDsUTlLo61ZErqEVapVGC4a6P29VyY+70kXFjMxMSGYvjVZ+ep8eSnEFccgBXKVHIVK + gavaFf94/4cl5pLavr6+x0V6SrCYyclJoedej8xca5blFOXYZORmrM3Oz5aZqk1Ca1urYLFYpBs/YRD+ + BRXUeyy/JnzhAAAAAElFTkSuQmCCtQMAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAA + AAFzUkdCAK7OHOkAAAAEZ0FNQQAAsY8L/GEFAAAACXBIWXMAAA68AAAOvAGVvHJJAAAAB3RJTUUH2gsZ + CyoP1jGCtQAAAAd0RVh0QXV0aG9yAKmuzEgAAAAMdEVYdERlc2NyaXB0aW9uABMJISMAAAAKdEVYdENv + cHlyaWdodACsD8w6AAAADnRFWHRDcmVhdGlvbiB0aW1lADX3DwkAAAAJdEVYdFNvZnR3YXJlAF1w/zoA + AAALdEVYdERpc2NsYWltZXIAt8C0jwAAAAh0RVh0V2FybmluZwDAG+aHAAAAB3RFWHRTb3VyY2UA9f+D + 6wAAAAh0RVh0Q29tbWVudAD2zJa/AAAABnRFWHRUaXRsZQCo7tInAAACY0lEQVQ4T42S3UuTYRjGdxz9 + Ax102GF/QFCB0IF5sNSM+TGdm010U9c2TdpX+ur8iM0sW2XOKfiRoRFzNhLF0gpNWnZgBlFoIHmQGZ0o + RfrreTYWphM6uN6X57mv67rv575vFfBfcCg+LjoGyb/UTaauWlwl7vcRU8HtbaOi+QmhyDsKypzcfzAs + rhOxfeRU0Np7mPsIRqsSFy++nYv/ZSUpBXuRU3GXp0sJg6RYVqKxdKcW7Eawt5+s8gCRGAxPLMVNJFyB + l2hr+lKLkujoDMXFzT0L9D4DfwSUwQ0cwVX0ngg17tbUQomkePQ12G4sUKpMka7zkWG4jrr0JiZbnaAd + 0MSk+M7AC3LPZ1GUm40+LxtT4TmM+Wp6Q12CluAeKA6OLeM0noRfi7A1CT9nYfMxOxshXJYSXs1OC/oe + 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 + AAAASUVORK5CYIIL - 05/05/2013 19:32:18 + 05/11/2013 11:24:15 diff --git a/ChanSort/MainForm.Designer.cs b/ChanSort/MainForm.Designer.cs index 69ed672..0bababf 100644 --- a/ChanSort/MainForm.Designer.cs +++ b/ChanSort/MainForm.Designer.cs @@ -106,7 +106,9 @@ this.miSaveAs = new DevExpress.XtraBars.BarButtonItem(); this.miOpenReferenceFile = new DevExpress.XtraBars.BarButtonItem(); this.miSaveReferenceFile = new DevExpress.XtraBars.BarButtonItem(); + this.miExcelExport = new DevExpress.XtraBars.BarButtonItem(); this.miQuit = new DevExpress.XtraBars.BarButtonItem(); + this.miRecentFiles = new DevExpress.XtraBars.BarListItem(); this.miEdit = new DevExpress.XtraBars.BarSubItem(); this.miAddChannel = new DevExpress.XtraBars.BarButtonItem(); this.miRemove = new DevExpress.XtraBars.BarButtonItem(); @@ -125,7 +127,7 @@ this.miHideOff = new DevExpress.XtraBars.BarButtonItem(); this.barSubItem2 = new DevExpress.XtraBars.BarSubItem(); this.miTvSettings = new DevExpress.XtraBars.BarButtonItem(); - this.miEraseChannelData = new DevExpress.XtraBars.BarButtonItem(); + this.miCleanupChannels = new DevExpress.XtraBars.BarButtonItem(); this.mnuOptions = new DevExpress.XtraBars.BarSubItem(); this.barSubItem1 = new DevExpress.XtraBars.BarSubItem(); this.miEnglish = new DevExpress.XtraBars.BarButtonItem(); @@ -134,7 +136,6 @@ this.miCharsetForm = new DevExpress.XtraBars.BarButtonItem(); this.miIsoCharSets = new DevExpress.XtraBars.BarListItem(); this.miShowWarningsAfterLoad = new DevExpress.XtraBars.BarCheckItem(); - this.miEraseDuplicateChannels = new DevExpress.XtraBars.BarCheckItem(); this.mnuHelp = new DevExpress.XtraBars.BarSubItem(); this.miWiki = new DevExpress.XtraBars.BarButtonItem(); this.miOpenWebsite = new DevExpress.XtraBars.BarButtonItem(); @@ -145,7 +146,6 @@ this.barDockControlRight = new DevExpress.XtraBars.BarDockControl(); this.miMoveUp = new DevExpress.XtraBars.BarButtonItem(); this.miMoveDown = new DevExpress.XtraBars.BarButtonItem(); - this.miCleanupChannels = new DevExpress.XtraBars.BarButtonItem(); this.labelControl2 = new DevExpress.XtraEditors.LabelControl(); this.txtSetSlot = new DevExpress.XtraEditors.ButtonEdit(); this.labelControl11 = new DevExpress.XtraEditors.LabelControl(); @@ -828,14 +828,14 @@ this.miHideOff, this.barSubItem2, this.miTvSettings, - this.miEraseChannelData, this.miOpenWebsite, this.miWiki, - this.miEraseDuplicateChannels, this.miShowWarningsAfterLoad, this.miCleanupChannels, - this.miSaveReferenceFile}); - this.barManager1.MaxItemId = 58; + this.miSaveReferenceFile, + this.miRecentFiles, + this.miExcelExport}); + this.barManager1.MaxItemId = 60; // // bar1 // @@ -848,7 +848,7 @@ new DevExpress.XtraBars.LinkPersistInfo(this.miOpen), new DevExpress.XtraBars.LinkPersistInfo(this.miOpenReferenceFile), new DevExpress.XtraBars.LinkPersistInfo(this.miReload), - new DevExpress.XtraBars.LinkPersistInfo(this.miSave), + new DevExpress.XtraBars.LinkPersistInfo(this.miSave, true), new DevExpress.XtraBars.LinkPersistInfo(this.miSaveAs), new DevExpress.XtraBars.LinkPersistInfo(this.miSaveReferenceFile), new DevExpress.XtraBars.LinkPersistInfo(this.miEdit, true), @@ -878,7 +878,9 @@ new DevExpress.XtraBars.LinkPersistInfo(this.miSaveAs), new DevExpress.XtraBars.LinkPersistInfo(this.miOpenReferenceFile, true), new DevExpress.XtraBars.LinkPersistInfo(this.miSaveReferenceFile), - new DevExpress.XtraBars.LinkPersistInfo(this.miQuit, true)}); + new DevExpress.XtraBars.LinkPersistInfo(this.miExcelExport), + new DevExpress.XtraBars.LinkPersistInfo(this.miQuit, true), + new DevExpress.XtraBars.LinkPersistInfo(this.miRecentFiles, true)}); this.miFile.Name = "miFile"; // // miOpen @@ -898,6 +900,7 @@ this.miReload.Enabled = false; this.miReload.Id = 7; this.miReload.ImageIndex = 5; + this.miReload.ItemShortcut = new DevExpress.XtraBars.BarShortcut((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.R)); this.miReload.Name = "miReload"; this.miReload.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miReload_ItemClick); // @@ -907,6 +910,8 @@ this.miRestoreOriginal.CategoryGuid = new System.Guid("e6c9a329-010b-4d79-8d4d-215e5f197ed3"); this.miRestoreOriginal.Id = 42; this.miRestoreOriginal.ImageIndex = 31; + this.miRestoreOriginal.ItemShortcut = new DevExpress.XtraBars.BarShortcut(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.R)); this.miRestoreOriginal.Name = "miRestoreOriginal"; this.miRestoreOriginal.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miRestoreOriginal_ItemClick); // @@ -916,6 +921,7 @@ this.miFileInformation.CategoryGuid = new System.Guid("e6c9a329-010b-4d79-8d4d-215e5f197ed3"); this.miFileInformation.Id = 43; this.miFileInformation.ImageIndex = 30; + this.miFileInformation.ItemShortcut = new DevExpress.XtraBars.BarShortcut((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I)); this.miFileInformation.Name = "miFileInformation"; this.miFileInformation.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miFileInformation_ItemClick); // @@ -936,6 +942,7 @@ this.miSaveAs.CategoryGuid = new System.Guid("e6c9a329-010b-4d79-8d4d-215e5f197ed3"); this.miSaveAs.Enabled = false; this.miSaveAs.Id = 8; + this.miSaveAs.ImageIndex = 33; this.miSaveAs.ItemShortcut = new DevExpress.XtraBars.BarShortcut(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S)); this.miSaveAs.Name = "miSaveAs"; @@ -947,6 +954,8 @@ this.miOpenReferenceFile.CategoryGuid = new System.Guid("e6c9a329-010b-4d79-8d4d-215e5f197ed3"); this.miOpenReferenceFile.Id = 44; this.miOpenReferenceFile.ImageIndex = 23; + this.miOpenReferenceFile.ItemShortcut = new DevExpress.XtraBars.BarShortcut(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.O)); this.miOpenReferenceFile.Name = "miOpenReferenceFile"; this.miOpenReferenceFile.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miOpenReferenceFile_ItemClick); // @@ -958,6 +967,16 @@ this.miSaveReferenceFile.Name = "miSaveReferenceFile"; this.miSaveReferenceFile.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miSaveReferenceFile_ItemClick); // + // miExcelExport + // + resources.ApplyResources(this.miExcelExport, "miExcelExport"); + this.miExcelExport.Id = 59; + this.miExcelExport.ImageIndex = 32; + this.miExcelExport.ItemShortcut = new DevExpress.XtraBars.BarShortcut(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + | System.Windows.Forms.Keys.C)); + this.miExcelExport.Name = "miExcelExport"; + this.miExcelExport.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miExcelExport_ItemClick); + // // miQuit // resources.ApplyResources(this.miQuit, "miQuit"); @@ -967,6 +986,13 @@ this.miQuit.Name = "miQuit"; this.miQuit.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miQuit_ItemClick); // + // miRecentFiles + // + resources.ApplyResources(this.miRecentFiles, "miRecentFiles"); + this.miRecentFiles.Id = 58; + this.miRecentFiles.Name = "miRecentFiles"; + this.miRecentFiles.ListItemClick += new DevExpress.XtraBars.ListItemClickEventHandler(this.miRecentFiles_ListItemClick); + // // miEdit // resources.ApplyResources(this.miEdit, "miEdit"); @@ -1150,7 +1176,6 @@ this.barSubItem2.Id = 47; this.barSubItem2.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { new DevExpress.XtraBars.LinkPersistInfo(this.miTvSettings), - new DevExpress.XtraBars.LinkPersistInfo(this.miEraseChannelData), new DevExpress.XtraBars.LinkPersistInfo(this.miCleanupChannels)}); this.barSubItem2.Name = "barSubItem2"; // @@ -1162,12 +1187,12 @@ this.miTvSettings.Name = "miTvSettings"; this.miTvSettings.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miTvCountrySetup_ItemClick); // - // miEraseChannelData + // miCleanupChannels // - resources.ApplyResources(this.miEraseChannelData, "miEraseChannelData"); - this.miEraseChannelData.Id = 49; - this.miEraseChannelData.Name = "miEraseChannelData"; - this.miEraseChannelData.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miEraseChannelData_ItemClick); + resources.ApplyResources(this.miCleanupChannels, "miCleanupChannels"); + this.miCleanupChannels.Id = 56; + this.miCleanupChannels.Name = "miCleanupChannels"; + this.miCleanupChannels.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miCleanupChannels_ItemClick); // // mnuOptions // @@ -1177,8 +1202,7 @@ this.mnuOptions.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { new DevExpress.XtraBars.LinkPersistInfo(DevExpress.XtraBars.BarLinkUserDefines.PaintStyle, this.barSubItem1, DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph), new DevExpress.XtraBars.LinkPersistInfo(DevExpress.XtraBars.BarLinkUserDefines.PaintStyle, this.mnuCharset, DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph), - new DevExpress.XtraBars.LinkPersistInfo(this.miShowWarningsAfterLoad), - new DevExpress.XtraBars.LinkPersistInfo(this.miEraseDuplicateChannels)}); + new DevExpress.XtraBars.LinkPersistInfo(this.miShowWarningsAfterLoad)}); this.mnuOptions.Name = "mnuOptions"; // // barSubItem1 @@ -1251,13 +1275,6 @@ this.miShowWarningsAfterLoad.Id = 54; this.miShowWarningsAfterLoad.Name = "miShowWarningsAfterLoad"; // - // miEraseDuplicateChannels - // - resources.ApplyResources(this.miEraseDuplicateChannels, "miEraseDuplicateChannels"); - this.miEraseDuplicateChannels.Checked = true; - this.miEraseDuplicateChannels.Id = 53; - this.miEraseDuplicateChannels.Name = "miEraseDuplicateChannels"; - // // mnuHelp // resources.ApplyResources(this.mnuHelp, "mnuHelp"); @@ -1330,13 +1347,6 @@ this.miMoveDown.Name = "miMoveDown"; this.miMoveDown.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miMoveDown_ItemClick); // - // miCleanupChannels - // - resources.ApplyResources(this.miCleanupChannels, "miCleanupChannels"); - this.miCleanupChannels.Id = 56; - this.miCleanupChannels.Name = "miCleanupChannels"; - this.miCleanupChannels.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(this.miCleanupChannels_ItemClick); - // // labelControl2 // resources.ApplyResources(this.labelControl2, "labelControl2"); @@ -1356,6 +1366,7 @@ // // labelControl11 // + this.labelControl11.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far; resources.ApplyResources(this.labelControl11, "labelControl11"); this.labelControl11.Name = "labelControl11"; // @@ -1395,8 +1406,6 @@ resources.ApplyResources(this.rbInsertSwap, "rbInsertSwap"); this.rbInsertSwap.MenuManager = this.barManager1; this.rbInsertSwap.Name = "rbInsertSwap"; - this.rbInsertSwap.Properties.Appearance.Options.UseTextOptions = true; - this.rbInsertSwap.Properties.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far; this.rbInsertSwap.Properties.Caption = resources.GetString("rbInsertSwap.Properties.Caption"); this.rbInsertSwap.Properties.CheckStyle = DevExpress.XtraEditors.Controls.CheckStyles.Radio; this.rbInsertSwap.Properties.GlyphAlignment = ((DevExpress.Utils.HorzAlignment)(resources.GetObject("rbInsertSwap.Properties.GlyphAlignment"))); @@ -1628,7 +1637,6 @@ private DevExpress.XtraBars.BarButtonItem miMoveDown; private DevExpress.XtraBars.BarSubItem barSubItem2; private DevExpress.XtraBars.BarButtonItem miTvSettings; - private DevExpress.XtraBars.BarButtonItem miEraseChannelData; private DevExpress.XtraEditors.PictureEdit picDonate; private DevExpress.XtraBars.BarButtonItem miOpenWebsite; private DevExpress.XtraBars.BarButtonItem miWiki; @@ -1650,10 +1658,11 @@ private DevExpress.XtraEditors.SimpleButton btnRemoveRight; private System.Windows.Forms.Timer timerEditDelay; private DevExpress.XtraBars.BarButtonItem miRenameChannel; - private DevExpress.XtraBars.BarCheckItem miEraseDuplicateChannels; private DevExpress.XtraBars.BarCheckItem miShowWarningsAfterLoad; private DevExpress.XtraBars.BarButtonItem miCleanupChannels; private DevExpress.XtraBars.BarButtonItem miSaveReferenceFile; + private DevExpress.XtraBars.BarListItem miRecentFiles; + private DevExpress.XtraBars.BarButtonItem miExcelExport; private DevExpress.XtraSplashScreen.SplashScreenManager splashScreenManager1; } } diff --git a/ChanSort/MainForm.cs b/ChanSort/MainForm.cs index bab7281..f6892cd 100644 --- a/ChanSort/MainForm.cs +++ b/ChanSort/MainForm.cs @@ -1,5 +1,4 @@ -//#define ENABLE_TV_FILE_CLEANUP -using System; +using System; using System.Collections.Generic; using System.Drawing; using System.Globalization; @@ -7,6 +6,7 @@ using System.IO; using System.Reflection; using System.Text; using System.Threading; +using System.Linq; using System.Windows.Forms; using ChanSort.Api; using ChanSort.Ui.Properties; @@ -24,7 +24,9 @@ namespace ChanSort.Ui { public partial class MainForm : XtraForm { - public const string AppVersion = "v2013-05-07"; + public const string AppVersion = "v2013-05-11"; + + private const int MaxMruEntries = 5; #region enum EditMode private enum EditMode @@ -50,6 +52,7 @@ namespace ChanSort.Ui private GridView lastFocusedGrid; private EditMode curEditMode = EditMode.InsertAfter; private bool dontOpenEditor; + private readonly List mruFiles = new List(); #region ctor() public MainForm() @@ -126,34 +129,47 @@ namespace ChanSort.Ui #region ShowOpenFileDialog() private void ShowOpenFileDialog() { + string supportedExtensions; + int numberOfFilters; + var filter = GetTvDataFileFilter(out supportedExtensions, out numberOfFilters); + + using (OpenFileDialog dlg = new OpenFileDialog()) + { + dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer); + dlg.AddExtension = true; + dlg.Filter = filter + string.Format(Resources.MainForm_FileDialog_OpenFileFilter, supportedExtensions); + dlg.FilterIndex = numberOfFilters + 1; + dlg.CheckFileExists = true; + dlg.RestoreDirectory = true; + if (dlg.ShowDialog() == DialogResult.OK) + { + var plugin = dlg.FilterIndex <= this.plugins.Count ? this.plugins[dlg.FilterIndex - 1] : null; + this.LoadFiles(plugin, dlg.FileName); + } + } + } + #endregion + + #region GetTvDataFileFilter() + private string GetTvDataFileFilter(out string supportedExtensions, out int numberOfFilters) + { + numberOfFilters = 0; StringBuilder filter = new StringBuilder(); - StringBuilder extension = new StringBuilder(); + var extension = new StringBuilder(); foreach (var plugin in this.plugins) { filter.Append(plugin.PluginName).Append("|").Append(plugin.FileFilter); extension.Append(plugin.FileFilter); filter.Append("|"); extension.Append(";"); + ++numberOfFilters; } if (extension.Length > 0) extension.Remove(extension.Length - 1, 1); - - using (OpenFileDialog dlg = new OpenFileDialog()) - { - dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer); - dlg.AddExtension = true; - dlg.Filter = filter + string.Format(Resources.MainForm_FileDialog_OpenFileFilter, extension); - dlg.FilterIndex = this.plugins.Count + 1; - dlg.CheckFileExists = true; - dlg.RestoreDirectory = true; - if (dlg.ShowDialog() == DialogResult.OK) - { - this.SetFileName(dlg.FileName); - var plugin = dlg.FilterIndex <= this.plugins.Count ? this.plugins[dlg.FilterIndex - 1] : null; - this.LoadFiles(plugin); - } - } + supportedExtensions = extension.ToString(); + return filter.ToString(); } + #endregion #region SetFileName() @@ -173,43 +189,25 @@ namespace ChanSort.Ui private void ReLoadFiles(ISerializerPlugin plugin) { int listIndex = this.tabChannelList.SelectedTabPageIndex; - this.LoadFiles(plugin); + this.LoadFiles(plugin, this.currentTvFile); this.tabChannelList.SelectedTabPageIndex = listIndex; } #endregion #region LoadFiles() - private void LoadFiles(ISerializerPlugin plugin) + private void LoadFiles(ISerializerPlugin plugin, string tvDataFile) { - SerializerBase newSerializer = null; bool dataUpdated = false; try { - if (plugin == null) - plugin = this.GetPluginForFile(this.currentTvFile); - // abort action if there is no currentTvSerializer for the input file - newSerializer = plugin == null ? null : plugin.CreateSerializer(this.currentTvFile); - if (newSerializer == null) - { - this.currentTvFile = this.currentTvSerializer == null ? string.Empty : this.currentTvSerializer.FileName; - return; - } - - if (!this.PromptSaveAndContinue()) + if (!this.LoadTvDataFile(plugin, tvDataFile)) return; dataUpdated = true; this.gviewRight.BeginDataUpdate(); this.gviewLeft.BeginDataUpdate(); - this.currentPlugin = plugin; - this.currentTvSerializer = newSerializer; - this.currentTvSerializer.DefaultEncoding = this.defaultEncoding; - this.miEraseChannelData.Enabled = newSerializer.Features.EraseChannelData; - if (!this.LoadTvDataFile()) - return; - this.editor = new Editor(); this.editor.DataRoot = this.dataRoot; @@ -233,7 +231,7 @@ namespace ChanSort.Ui { if (!(ex is IOException)) throw; - string name = newSerializer != null ? newSerializer.DisplayName : plugin != null ? plugin.PluginName : "Loader"; + string name = plugin != null ? plugin.PluginName : "Loader"; XtraMessageBox.Show(this, name + "\n\n" + ex.Message, Resources.MainForm_LoadFiles_IOException, MessageBoxButtons.OK, MessageBoxIcon.Error); this.currentPlugin = null; @@ -328,19 +326,51 @@ namespace ChanSort.Ui #endregion #region LoadTvDataFile() - private bool LoadTvDataFile() + private bool LoadTvDataFile(ISerializerPlugin plugin, string tvDataFile) { -#if ENABLE_TV_FILE_CLEANUP - this.currentTvSerializer.EraseDuplicateChannels = this.miEraseDuplicateChannels.Checked; -#else - this.currentTvSerializer.EraseDuplicateChannels = false; -#endif - this.currentTvSerializer.Load(); + if (!File.Exists(tvDataFile)) + { + XtraMessageBox.Show(this, Resources.MainForm_LoadTvDataFile_FileNotFound_Caption, + string.Format(Resources.MainForm_LoadTvDataFile_FileNotFound_Message, tvDataFile), + MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return false; + } + + if (plugin == null) + plugin = this.GetPluginForFile(tvDataFile); + // abort action if there is no currentTvSerializer for the input file + var serializer = plugin == null ? null : plugin.CreateSerializer(tvDataFile); + if (serializer == null) + return false; + + if (!this.PromptSaveAndContinue()) + return false; + + serializer.DefaultEncoding = this.defaultEncoding; + serializer.Load(); + this.SetFileName(tvDataFile); + this.currentPlugin = plugin; + this.currentTvSerializer = serializer; 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; + this.mruFiles.Remove(file); + if (this.mruFiles.Count >= MaxMruEntries) + this.mruFiles.RemoveAt(this.mruFiles.Count-1); + this.mruFiles.Insert(0, file); + } + #endregion + #region PromptSaveAndContinue() private bool PromptSaveAndContinue() { @@ -405,42 +435,70 @@ namespace ChanSort.Ui { dlg.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer); } + string supportedExtensions; + int numberOfFilters; + string filter = this.GetTvDataFileFilter(out supportedExtensions, out numberOfFilters); + filter = "ChanSort|*.csv|SamToolBox|*.chl|" + filter; + supportedExtensions = "*.csv;*.chl;" + supportedExtensions; dlg.AddExtension = true; dlg.AutoUpgradeEnabled = true; dlg.CheckFileExists = true; dlg.DefaultExt = ".csv"; dlg.DereferenceLinks = true; - dlg.Filter = Resources.MainForm_ShowOpenReferenceFileDialog_Filter; - dlg.FilterIndex = 3; + dlg.Filter = filter + string.Format(Resources.MainForm_FileDialog_OpenFileFilter, supportedExtensions); + dlg.FilterIndex = numberOfFilters + 3; dlg.RestoreDirectory = true; dlg.SupportMultiDottedExtensions = false; dlg.ValidateNames = true; dlg.Title = this.miOpenReferenceFile.Caption; if (dlg.ShowDialog(this) == DialogResult.OK) { - this.gviewRight.BeginDataUpdate(); - this.gviewLeft.BeginDataUpdate(); - - string ext = (Path.GetExtension(dlg.FileName) ?? "").ToLower(); - if (ext == ".csv") - { - var csvSerializer = new CsvFileSerializer(dlg.FileName, this.dataRoot); - csvSerializer.Load(); - } - else if (ext == ".chl") - { - ChlFileSerializer loader = new ChlFileSerializer(); - string warnings = loader.Load(dlg.FileName, this.dataRoot, this.currentChannelList); - InfoBox.Show(this, warnings, Path.GetFileName(dlg.FileName)); - } - - this.gviewRight.EndDataUpdate(); - this.gviewLeft.EndDataUpdate(); + this.LoadReferenceFile(dlg.FileName); } } } #endregion + #region LoadReferenceFile() + private void LoadReferenceFile(string fileName) + { + this.gviewRight.BeginDataUpdate(); + this.gviewLeft.BeginDataUpdate(); + + string ext = (Path.GetExtension(fileName) ?? "").ToLower(); + if (ext == ".csv") + { + var csvSerializer = new CsvFileSerializer(fileName, this.dataRoot); + csvSerializer.Load(); + } + else if (ext == ".chl") + { + 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 ShowChannelList() private void ShowChannelList(ChannelList channelList) @@ -512,6 +570,7 @@ namespace ChanSort.Ui this.SaveTvDataFile(); this.dataRoot.NeedsSaving = false; this.RefreshGrid(this.gviewLeft, this.gviewRight); + this.UpdateMenu(); } catch (IOException ex) { @@ -796,12 +855,13 @@ namespace ChanSort.Ui #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); - this.SetFileName(Settings.Default.InputTLL); + int width = Settings.Default.LeftPanelWidth; if (width > 0) this.splitContainerControl1.SplitterPosition = width; @@ -809,10 +869,15 @@ namespace ChanSort.Ui this.SetGridLayout(this.gviewLeft, Settings.Default.OutputListLayout); - this.miEraseDuplicateChannels.Checked = Settings.Default.EraseDuplicateChannels; this.miShowWarningsAfterLoad.Checked = Settings.Default.ShowWarningsAfterLoading; this.cbCloseGap.Checked = Settings.Default.CloseGaps; this.ClearLeftFilter(); + + for (int i = MaxMruEntries-1; i >= 0; i--) + { + this.AddFileToMruList((string)Settings.Default.GetType().GetProperty("MruFile" + i).GetValue(Settings.Default, null)); + } + this.UpdateMruMenu(); } #endregion @@ -869,14 +934,15 @@ namespace ChanSort.Ui 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.InputTLL = this.currentTvFile; Settings.Default.LeftPanelWidth = this.splitContainerControl1.SplitterPosition; Settings.Default.OutputListLayout = GetGridLayout(this.gviewLeft); if (this.currentChannelList != null) SaveInputGridLayout(this.currentChannelList.SignalSource); - Settings.Default.EraseDuplicateChannels = this.miEraseDuplicateChannels.Checked; 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); + Settings.Default.Save(); } @@ -1098,7 +1164,18 @@ namespace ChanSort.Ui #region UpdateMenu private void UpdateMenu() { + bool fileLoaded = this.dataRoot != null; bool isRight = this.lastFocusedGrid == this.gviewRight; + + this.miReload.Enabled = fileLoaded; + this.miFileInformation.Enabled = fileLoaded; + this.miRestoreOriginal.Enabled = fileLoaded && File.Exists(this.currentTvFile + ".bak"); + this.miSave.Enabled = fileLoaded; + this.miSaveAs.Enabled = fileLoaded; + this.miOpenReferenceFile.Enabled = fileLoaded; + this.miSaveReferenceFile.Enabled = fileLoaded; + this.miExcelExport.Enabled = fileLoaded; + this.miAddChannel.Enabled = isRight; var visRight = isRight ? BarItemVisibility.Always : BarItemVisibility.Never; @@ -1115,15 +1192,22 @@ namespace ChanSort.Ui this.miMoveUp.Enabled = channel != null && channel.NewProgramNr > 1; this.miTvSettings.Enabled = this.currentTvSerializer != null; -#if ENABLE_TV_FILE_CLEANUP this.miCleanupChannels.Visibility = this.currentTvSerializer != null && this.currentTvSerializer.Features.CleanUpChannelData ? BarItemVisibility.Always : BarItemVisibility.Never; - this.miEraseDuplicateChannels.Visibility = BarItemVisibility.Always; -#else - this.miCleanupChannels.Visibility = BarItemVisibility.Never; - this.miEraseDuplicateChannels.Visibility = BarItemVisibility.Never; - this.miEraseDuplicateChannels.Checked = false; -#endif + } + #endregion + + #region UpdateMruMenu() + private void UpdateMruMenu() + { + this.miRecentFiles.Strings.Clear(); + foreach (var file in this.mruFiles) + { + var key = Path.GetFileName(Path.GetDirectoryName(file)) + "\\" + Path.GetFileName(file); + if (key != file) + key = "...\\" + key; + this.miRecentFiles.Strings.Add(key); + } } #endregion @@ -1152,7 +1236,7 @@ namespace ChanSort.Ui { File.Copy(bakFile, this.currentTvFile, true); if (this.currentPlugin != null) - this.LoadFiles(this.currentPlugin); + this.LoadFiles(this.currentPlugin, this.currentTvFile); } catch (Exception) { @@ -1251,7 +1335,6 @@ namespace ChanSort.Ui { if (this.currentTvSerializer != null && this.currentTvSerializer.Features.CleanUpChannelData) { - this.currentTvSerializer.EraseDuplicateChannels = true; var msg = this.currentTvSerializer.CleanUpChannelData(); this.FillChannelListCombo(); InfoBox.Show(this, msg, this.miCleanupChannels.Caption); @@ -1260,6 +1343,50 @@ namespace ChanSort.Ui } #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 channel in list.Channels.OrderBy(c => c.NewProgramNr)) + { + if (channel.IsDeleted || channel.OldProgramNr == -1) + continue; + sb.Append(list.ShortCaption).Append(sep); + sb.Append(channel.NewProgramNr).Append(sep); + sb.Append('"').Append(channel.Name).Append('"').Append(sep); + sb.Append(channel.Favorites).Append(sep); + sb.Append(channel.Lock ? "L" : "").Append(sep); + sb.Append(channel.Skip ? "S" : "").Append(sep); + sb.Append(channel.Hidden ? "H" : "").Append(sep); + sb.Append(channel.Encrypted == null ? "?" : channel.Encrypted.Value ? "C" : "").Append(sep); + sb.Append('"').Append(channel.Satellite).Append('"').Append(sep); + sb.Append(channel.ChannelOrTransponder).Append(sep); + sb.Append(channel.FreqInMhz).Append(sep); + sb.Append(channel.OriginalNetworkId).Append(sep); + sb.Append(channel.TransportStreamId).Append(sep); + sb.Append(channel.SymbolRate).Append(sep); + 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); + } + #endregion + // UI events #region MainForm_Load @@ -1275,8 +1402,8 @@ namespace ChanSort.Ui { try { - if (this.currentTvFile != "" && File.Exists(this.currentTvFile)) - this.LoadFiles(null); + if (this.mruFiles.Count > 0 && File.Exists(this.mruFiles[0])) + this.LoadFiles(null, this.mruFiles[0]); } catch (Exception ex) { HandleException(ex); } } @@ -1326,11 +1453,21 @@ namespace ChanSort.Ui TryExecute(this.SaveReferenceFile); } + private void miExcelExport_ItemClick(object sender, ItemClickEventArgs e) + { + TryExecute(this.ExportExcelList); + } + private void miQuit_ItemClick(object sender, ItemClickEventArgs e) { this.Close(); } + private void miRecentFiles_ListItemClick(object sender, ListItemClickEventArgs e) + { + TryExecute(()=>this.LoadFiles(null, this.mruFiles[e.Index])); + } + #endregion #region Edit menu @@ -1433,28 +1570,6 @@ namespace ChanSort.Ui this.TryExecute(this.ShowTvCountrySettings); } - private void miEraseChannelData_ItemClick(object sender, ItemClickEventArgs e) - { - if (this.currentTvSerializer == null) - return; - - if (XtraMessageBox.Show(this, - Resources.MainForm_btnResetChannelData_Click_Message, - Resources.MainForm_btnResetChannelData_Click_Caption, - MessageBoxButtons.YesNo, - MessageBoxIcon.Warning, - MessageBoxDefaultButton.Button2) != DialogResult.Yes) - { - return; - } - - TryExecute(() => - { - this.currentTvSerializer.EraseChannelData(); - this.LoadFiles(this.currentPlugin); - }); - } - private void miCleanupChannels_ItemClick(object sender, ItemClickEventArgs e) { this.TryExecute(this.CleanupChannelData); @@ -1988,6 +2103,5 @@ namespace ChanSort.Ui } #endregion - } } diff --git a/ChanSort/MainForm.de.resx b/ChanSort/MainForm.de.resx index cae5129..e8c7b33 100644 --- a/ChanSort/MainForm.de.resx +++ b/ChanSort/MainForm.de.resx @@ -117,6 +117,50 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + + + + + + Default + + + Top, Left + + + + + + Tile + + + Inherit + + + + Center + + + + + + + None + + + + + + + Horizontal + + + + Neue Pr# @@ -129,13 +173,34 @@ Favoriten + + Default + + + + False + + + True + + + _ + + + True + + + True + + + False + Ge- sperrt Kindersicherung - 333, 17 @@ -166,12 +231,15 @@ Referenzliste öffnen... - - &Beenden - Referenzliste speichern + + Excel liste exportieren... + + + &Beenden + &Bearbeiten @@ -220,9 +288,6 @@ Geräte&einstellungen... - - Alle Senderdaten löschen - &Einstellungen @@ -238,12 +303,6 @@ Eventuelle Warnungen nach dem Laden einer TV-Datei automatisch anzeigen - - TV-Datei automatisch bereinigen - - - Nicht verwendete Senderdaten beim Laden der Datei automatisch entfernen - &Hilfe @@ -294,24 +353,126 @@ WIeWYGkVXQEL + + Horizontal + + + + + + Horizontal + + + + + + Horizontal + + + + + + Horizontal + + + + Nach oben Nach unten + + + + + + + + Horizontal + + + + + + True + tauschen + + + + + + + + + + + + + + + + + True + dahinter + + + + + + + + + + + + + + + + + True + davor + + + + + + + + + + + + + + + + + True + Lücken beim Verschieben/Entfernen von Sendern schließen + + + + + + + + + Wenn aktiv, werden folgende Programmnummer automatisch vorgerückt @@ -321,6 +482,18 @@ Einfügemodus: + + + + + + + + Horizontal + + + + Keine Datei geladen @@ -330,12 +503,54 @@ Programplatz für Einfügen und Festlegen + + + + + + + + True + + + Default + + + False + + + True + + + _ + + + True + + + True + + + False + + + + + + False + ChanSort {0} - Senderlisten-Editor für Samsung, LG und Toshiba TVs Kindersicherung + + Horizontal + + + + Filter entfernen @@ -351,6 +566,45 @@ Sortierte Sender (.csv) + + + + + + + + Default + + + Top, Left + + + + + + Tile + + + Inherit + + + Center + + + + + + None + + + + + + Horizontal + + + + Alte Pr# @@ -372,6 +626,27 @@ Favoriten + + Default + + + False + + + True + + + _ + + + True + + + True + + + False + Ge- sperrt @@ -426,6 +701,12 @@ Aller derzeit nicht sortierten Sender ans Ende der Liste anhängen + + Horizontal + + + + Filter entfernen diff --git a/ChanSort/MainForm.resx b/ChanSort/MainForm.resx index 75028e3..47bdb76 100644 --- a/ChanSort/MainForm.resx +++ b/ChanSort/MainForm.resx @@ -123,7 +123,7 @@ - 0, 109 + 0, 88 361, 17 @@ -222,7 +222,7 @@ 35 - 382, 417 + 382, 438 1 @@ -243,7 +243,7 @@ Bottom - 2, 471 + 2, 492 2, 2, 2, 2 @@ -282,7 +282,7 @@ 1474, 599 - 5, 24 + 218, 6 475, 17 @@ -314,9 +314,15 @@ Save reference list + + Export Excel list... + &Quit + + miRecentFiles + &Edit @@ -371,14 +377,11 @@ Device setting... - - Erase all channel data - Cleanup channel data - Remove duplicate channels and reorganize + Reorganize channel records and remove duplicates &Settings @@ -404,12 +407,6 @@ Show warnings after loading file - - Cleanup TV data file after loading - - - Automatically clean up TV data file after loading - &Help @@ -561,7 +558,7 @@ - Far + Default 77, 19 @@ -585,7 +582,7 @@ True - 88, 24 + 153, 6 after @@ -609,7 +606,7 @@ 1 - 88, 5 + 82, 6 before @@ -636,7 +633,7 @@ True - 263, 6 + 496, 6 Close gap when moving/deleting a channel @@ -717,7 +714,7 @@ Bottom, Left - 0, 54 + 0, 33 632, 0 @@ -759,10 +756,10 @@ Vertical - 169, 8 + 320, 8 - 80, 13 + 64, 13 0 @@ -786,7 +783,7 @@ 7 - 169, 24 + 390, 5 OK @@ -822,7 +819,7 @@ 0, 31 - 1474, 78 + 1474, 57 0 @@ -1160,12 +1157,24 @@ DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + miExcelExport + + + DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + miQuit DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + + miRecentFiles + + + DevExpress.XtraBars.BarListItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a + miEdit @@ -1274,10 +1283,10 @@ DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - - miEraseChannelData + + miCleanupChannels - + DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a @@ -1328,12 +1337,6 @@ DevExpress.XtraBars.BarCheckItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - - miEraseDuplicateChannels - - - DevExpress.XtraBars.BarCheckItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - mnuHelp @@ -1370,12 +1373,6 @@ DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - - miCleanupChannels - - - DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - defaultLookAndFeel1 @@ -1407,7 +1404,7 @@ DevExpress.XtraEditors.XtraForm, DevExpress.Utils.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a - 05/07/2013 01:07:27 + 05/11/2013 13:20:06 16, 16 @@ -1722,7 +1719,7 @@ 0, 0 - 386, 490 + 386, 511 0 @@ -2052,7 +2049,7 @@ Signal source - 1079, 417 + 1079, 438 1 @@ -2073,7 +2070,7 @@ Bottom - 2, 471 + 2, 492 2, 2, 2, 2 @@ -2241,7 +2238,7 @@ 0, 0 - 1083, 490 + 1083, 511 0 @@ -2265,7 +2262,7 @@ Panel2 - 1474, 490 + 1474, 511 5 diff --git a/ChanSort/Properties/Resources.Designer.cs b/ChanSort/Properties/Resources.Designer.cs index 3381552..ded89f6 100644 --- a/ChanSort/Properties/Resources.Designer.cs +++ b/ChanSort/Properties/Resources.Designer.cs @@ -96,6 +96,16 @@ namespace ChanSort.Ui.Properties { } } + /// + /// Looks up a localized string similar to The channel list has been copied to the clipboard + ///and can be pasted into Excel or any text editor.. + /// + internal static string MainForm_ExportExcelList_Message { + get { + return ResourceManager.GetString("MainForm_ExportExcelList_Message", resourceCulture); + } + } + /// /// Looks up a localized string similar to Supported Files|{0}|All Files (*.*)|*. /// @@ -228,6 +238,24 @@ namespace ChanSort.Ui.Properties { } } + /// + /// Looks up a localized string similar to File not found. + /// + internal static string MainForm_LoadTvDataFile_FileNotFound_Caption { + get { + return ResourceManager.GetString("MainForm_LoadTvDataFile_FileNotFound_Caption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The file {0} does not exist.. + /// + internal static string MainForm_LoadTvDataFile_FileNotFound_Message { + get { + return ResourceManager.GetString("MainForm_LoadTvDataFile_FileNotFound_Message", resourceCulture); + } + } + /// /// Looks up a localized string similar to You are about to restore the backup file. All changes will be lost! ///Do you want to continue?. diff --git a/ChanSort/Properties/Resources.de.resx b/ChanSort/Properties/Resources.de.resx index f67f919..9e2f4bb 100644 --- a/ChanSort/Properties/Resources.de.resx +++ b/ChanSort/Properties/Resources.de.resx @@ -261,4 +261,14 @@ Möchten Sie die Downloadseite öffnen? Abbrechen + + Datei nicht gefunden + + + Die Datei {0} konnte nicht gefunden werden. + + + Die Senderliste wurde in die Zwischenablage kopiert +und kann nun in Excel oder einen Texteditor eingefügt werden. + \ No newline at end of file diff --git a/ChanSort/Properties/Resources.resx b/ChanSort/Properties/Resources.resx index 5a3e7f7..faab5b9 100644 --- a/ChanSort/Properties/Resources.resx +++ b/ChanSort/Properties/Resources.resx @@ -260,4 +260,14 @@ Do you want to open the download website? Cancel + + File not found + + + The file {0} does not exist. + + + The channel list has been copied to the clipboard +and can be pasted into Excel or any text editor. + \ No newline at end of file diff --git a/ChanSort/Properties/Settings.Designer.cs b/ChanSort/Properties/Settings.Designer.cs index d24c3ae..0ddbaf9 100644 --- a/ChanSort/Properties/Settings.Designer.cs +++ b/ChanSort/Properties/Settings.Designer.cs @@ -23,18 +23,6 @@ namespace ChanSort.Ui.Properties { } } - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("")] - public string InputTLL { - get { - return ((string)(this["InputTLL"])); - } - set { - this["InputTLL"] = value; - } - } - [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("0")] @@ -322,5 +310,65 @@ namespace ChanSort.Ui.Properties { this["CloseGaps"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string MruFile0 { + get { + return ((string)(this["MruFile0"])); + } + set { + this["MruFile0"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string MruFile1 { + get { + return ((string)(this["MruFile1"])); + } + set { + this["MruFile1"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string MruFile2 { + get { + return ((string)(this["MruFile2"])); + } + set { + this["MruFile2"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string MruFile3 { + get { + return ((string)(this["MruFile3"])); + } + set { + this["MruFile3"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string MruFile4 { + get { + return ((string)(this["MruFile4"])); + } + set { + this["MruFile4"] = value; + } + } } } diff --git a/ChanSort/Properties/Settings.settings b/ChanSort/Properties/Settings.settings index 61dddc6..3c96b49 100644 --- a/ChanSort/Properties/Settings.settings +++ b/ChanSort/Properties/Settings.settings @@ -2,9 +2,6 @@ - - - 0 @@ -77,5 +74,20 @@ True + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ChanSort/app.config b/ChanSort/app.config index 2c025b9..b7cc4c8 100644 --- a/ChanSort/app.config +++ b/ChanSort/app.config @@ -8,9 +8,6 @@ - - - 0 @@ -83,6 +80,21 @@ True + + + + + + + + + + + + + + + diff --git a/Test.Loader.LG/DvbsCleanup/TestDvbsCleanup.cs b/Test.Loader.LG/DvbsCleanup/TestDvbsCleanup.cs new file mode 100644 index 0000000..1025c73 --- /dev/null +++ b/Test.Loader.LG/DvbsCleanup/TestDvbsCleanup.cs @@ -0,0 +1,57 @@ +using System.IO; +using ChanSort.Loader.LG; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Test.Loader.LG +{ + [TestClass] + public class TestDvbsCleanup : TestBase + { + [TestMethod] + public void TestLM620S_WithSatChannels() + { + // "VitorMartinsAugusto" + this.ExecuteTest("DvbsCleanup/xxLM620S-ZE00001"); + } + + [TestMethod] + public void TestLM860V_WithoutSatChannels() + { + // "PDA-User" + this.ExecuteTest("DvbsCleanup/xxLM860V-ZB99998"); + } + + [TestMethod] + public void TestLM640T_WithBogusDvbsBlock() + { + // "OmarGadzhiev" + this.ExecuteTest("DvbsCleanup/xxLM640T-ZA00000"); + } + + + private void ExecuteTest(string modelAndBaseName, bool generateReferenceFile = false) + { + // copy required input and assertion files + DeploymentItem("ChanSort.Loader.LG\\ChanSort.Loader.LG.ini"); + DeploymentItem("Test.Loader.LG\\" + modelAndBaseName + ".TLL.in"); + DeploymentItem("Test.Loader.LG\\" + modelAndBaseName + ".TLL.out"); + + var baseName = Path.GetFileNameWithoutExtension(modelAndBaseName); + + // load the TLL file + TllFileSerializerPlugin plugin = new TllFileSerializerPlugin(); + var serializer = (TllFileSerializer)plugin.CreateSerializer(baseName + ".TLL.in"); + serializer.IsTesting = true; + serializer.Load(); + serializer.DataRoot.ApplyCurrentProgramNumbers(); + + // save TLL file and compare to reference file + serializer.CleanUpChannelData(); + serializer.Save(tempFile); + if (generateReferenceFile) + File.Copy(tempFile, this.GetSolutionBaseDir() + "\\Test.Loader.LG\\" + modelAndBaseName + ".TLL.out", true); + else + AssertBinaryFileContent(tempFile, baseName + ".TLL.out"); + } + } +} diff --git a/Test.Loader.LG/DvbsCleanup/xxLM620S-ZE00001.TLL.in b/Test.Loader.LG/DvbsCleanup/xxLM620S-ZE00001.TLL.in new file mode 100644 index 0000000..afa8e1e Binary files /dev/null and b/Test.Loader.LG/DvbsCleanup/xxLM620S-ZE00001.TLL.in differ diff --git a/Test.Loader.LG/DvbsCleanup/xxLM620S-ZE00001.TLL.out b/Test.Loader.LG/DvbsCleanup/xxLM620S-ZE00001.TLL.out new file mode 100644 index 0000000..e0d60c5 Binary files /dev/null and b/Test.Loader.LG/DvbsCleanup/xxLM620S-ZE00001.TLL.out differ diff --git a/Test.Loader.LG/DvbsCleanup/xxLM640T-ZA00000.TLL.in b/Test.Loader.LG/DvbsCleanup/xxLM640T-ZA00000.TLL.in new file mode 100644 index 0000000..90a0123 Binary files /dev/null and b/Test.Loader.LG/DvbsCleanup/xxLM640T-ZA00000.TLL.in differ diff --git a/Test.Loader.LG/DvbsCleanup/xxLM640T-ZA00000.TLL.out b/Test.Loader.LG/DvbsCleanup/xxLM640T-ZA00000.TLL.out new file mode 100644 index 0000000..90a0123 Binary files /dev/null and b/Test.Loader.LG/DvbsCleanup/xxLM640T-ZA00000.TLL.out differ diff --git a/Test.Loader.LG/DvbsCleanup/xxLM860V-ZB99998.TLL.in b/Test.Loader.LG/DvbsCleanup/xxLM860V-ZB99998.TLL.in new file mode 100644 index 0000000..7eb0e9c Binary files /dev/null and b/Test.Loader.LG/DvbsCleanup/xxLM860V-ZB99998.TLL.in differ diff --git a/Test.Loader.LG/DvbsCleanup/xxLM860V-ZB99998.TLL.out b/Test.Loader.LG/DvbsCleanup/xxLM860V-ZB99998.TLL.out new file mode 100644 index 0000000..7eb0e9c Binary files /dev/null and b/Test.Loader.LG/DvbsCleanup/xxLM860V-ZB99998.TLL.out differ diff --git a/Test.Loader.LG/LK/xxLK950S-ZA00001.TLL.out b/Test.Loader.LG/LK/xxLK950S-ZA00001.TLL.out index 5a49306..de055b8 100644 Binary files a/Test.Loader.LG/LK/xxLK950S-ZA00001.TLL.out and b/Test.Loader.LG/LK/xxLK950S-ZA00001.TLL.out differ diff --git a/Test.Loader.LG/LN/xxLN5406-ZA99999.TLL.out b/Test.Loader.LG/LN/xxLN5406-ZA99999.TLL.out index ceb612d..d235a69 100644 Binary files a/Test.Loader.LG/LN/xxLN5406-ZA99999.TLL.out and b/Test.Loader.LG/LN/xxLN5406-ZA99999.TLL.out differ diff --git a/Test.Loader.LG/LV/xxLV375S-ZC00001.TLL.out b/Test.Loader.LG/LV/xxLV375S-ZC00001.TLL.out index 4928b77..7e42491 100644 Binary files a/Test.Loader.LG/LV/xxLV375S-ZC00001.TLL.out and b/Test.Loader.LG/LV/xxLV375S-ZC00001.TLL.out differ diff --git a/Test.Loader.LG/LV/xxLV470S-ZC00001.TLL.out b/Test.Loader.LG/LV/xxLV470S-ZC00001.TLL.out index 9bd08a8..436139a 100644 Binary files a/Test.Loader.LG/LV/xxLV470S-ZC00001.TLL.out and b/Test.Loader.LG/LV/xxLV470S-ZC00001.TLL.out differ diff --git a/Test.Loader.LG/LV/xxLV579S-ZB00001.TLL.out b/Test.Loader.LG/LV/xxLV579S-ZB00001.TLL.out index 4b02e78..b0352fd 100644 Binary files a/Test.Loader.LG/LV/xxLV579S-ZB00001.TLL.out and b/Test.Loader.LG/LV/xxLV579S-ZB00001.TLL.out differ diff --git a/Test.Loader.LG/LW/xxLW659S-ZC00001.TLL.out b/Test.Loader.LG/LW/xxLW659S-ZC00001.TLL.out index aaa6031..40b5568 100644 Binary files a/Test.Loader.LG/LW/xxLW659S-ZC00001.TLL.out and b/Test.Loader.LG/LW/xxLW659S-ZC00001.TLL.out differ diff --git a/Test.Loader.LG/Test.Loader.LG.csproj b/Test.Loader.LG/Test.Loader.LG.csproj index 0697f92..4027df9 100644 --- a/Test.Loader.LG/Test.Loader.LG.csproj +++ b/Test.Loader.LG/Test.Loader.LG.csproj @@ -88,6 +88,7 @@ + diff --git a/Test.Loader.LG/TestBase.cs b/Test.Loader.LG/TestBase.cs index 72b93b5..f22a0af 100644 --- a/Test.Loader.LG/TestBase.cs +++ b/Test.Loader.LG/TestBase.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text; using Microsoft.VisualStudio.TestTools.UnitTesting; using ChanSort.Api; using ChanSort.Loader.LG; @@ -86,7 +87,7 @@ namespace Test.Loader.LG #endregion #region AssertBinaryFileContent() - private void AssertBinaryFileContent(string actualFile, string expectedFile) + protected void AssertBinaryFileContent(string actualFile, string expectedFile) { var actual = File.ReadAllBytes(actualFile); var expected = File.ReadAllBytes(expectedFile); @@ -94,7 +95,16 @@ namespace Test.Loader.LG for (int i = 0; i < actual.Length; i++) { if (actual[i] != expected[i]) - Assert.Fail("Files differ at index {0}: expected {1} but found {2}", i, expected[i], actual[i]); + { + StringBuilder sb1 = new StringBuilder(); + StringBuilder sb2 = new StringBuilder(); + for (int j = 0; j < 8 && i + j < expected.Length; j++) + { + sb1.AppendFormat("{0:X2} ", expected[i + j]); + sb2.AppendFormat("{0:X2} ", actual[i + j]); + } + Assert.Fail("Files differ at index {0}: expected <{1}> but found <{2}>", i, sb1, sb2); + } } } #endregion @@ -119,7 +129,7 @@ namespace Test.Loader.LG #endregion #region GetSolutionBaseDir() - private string GetSolutionBaseDir() + protected string GetSolutionBaseDir() { var dir = Path.GetDirectoryName(this.GetType().Assembly.Location); do diff --git a/Test.Loader/LgTest.cs b/Test.Loader/LgTest.cs index 28a0ec0..2ba2e7a 100644 --- a/Test.Loader/LgTest.cs +++ b/Test.Loader/LgTest.cs @@ -54,6 +54,7 @@ namespace Test.Loader "\t" + (analogList == null ? 0 : analogList.Count) + "\t" + (digitalList == null ? 0 : digitalList.Count) + "\t" + (satChannelList == null ? 0 : satChannelList.Count) + + "\t" + serializer.DvbsSymbolRateCorrectionFactor + "\t" + relPath; diff --git a/readme.txt b/readme.txt index d1d5839..e53889b 100644 --- a/readme.txt +++ b/readme.txt @@ -1,9 +1,15 @@ -Version v2013-05-07 ====================================================== +Version v2013-05-11 ====================================================== Changes: -- Added support for LG's LN-series -- Fixed: Saving reordered list for LG xxLH3000. -- Removed "Cleanup TV data file" function due to having bricked an LG TV. +- TV data files can be used as reference lists (without exporting .csv) +- added "Export Excel list" function +- added hotkeys to many menu items +- added most recently used files to menu +- added support to enable Hotel Mode for LH3000 and LN models +- fixed: saved incorrect DVB-S transponder symbol rate for LG's LK950S, LV, + LW and LN models +- re-added a fixed version of "TV-Set / Clean channel data" function for + LG TV's. The complete change log can be found at the end of this document @@ -101,6 +107,17 @@ OTHER DEALINGS IN THE SOFTWARE. Change log ================================================================ +2013-05-11 +- TV data files can be used as reference lists (without exporting .csv) +- added "File / Export Excel list" function +- added hotkeys to many menu items +- added most recently used files to menu +- added support to enable Hotel Mode for LH3000 and LN models +- fixed: saved incorrect DVB-S transponder symbol rate for LG's LK950S, LV, + LW and LN models +- re-added "TV-Set / Clean channel data" function for LG TV's. + + 2013-05-07 - Added support for LG's LN-series - Fixed: Saving reordered list for LG xxLH3000.