- 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.
This commit is contained in:
hbeham
2013-05-11 16:45:29 +02:00
parent e3e58ea5bc
commit 0d03481232
34 changed files with 1360 additions and 636 deletions

View File

@@ -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)

View File

@@ -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)
{

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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<satConfig.transponderCount; i++)
{
@@ -385,17 +389,26 @@ namespace ChanSort.Loader.LG
SatTransponder transponder = new SatTransponder(i, mapping, this.DataRoot);
if (transponder.Satellite == null)
continue;
if (transponder.SymbolRate == 11000)
this.isDvbsSymbolRateDiv2 = true;
if ((transponder.SymbolRate & 0x7FFF) == 11000)
dvbsSymbolRateFactor = 2;
else if (transponder.SymbolRate == 44000)
{
dvbsSymbolRateMask = 0xFFFF;
dvbsSymbolRateFactor = 0.5m;
}
var sat = transponder.Satellite;
this.DataRoot.AddTransponder(sat, transponder);
}
if (this.isDvbsSymbolRateDiv2)
if (dvbsSymbolRateFactor != 1)
{
foreach (var transponder in this.DataRoot.Transponder.Values)
transponder.SymbolRate *= 2;
{
int symbolRate = transponder.SymbolRate & dvbsSymbolRateMask;
transponder.SymbolRate = (int) (symbolRate*dvbsSymbolRateFactor);
}
}
off += this.satConfig.transponderCount * this.satConfig.transponderLength;
@@ -477,7 +490,7 @@ namespace ChanSort.Loader.LG
// Test code for fixing broken DVB-S block of xxLM640T ==========
#region EraseDvbsBlock()
#if LM640T_EXPERIMENT
/// <summary>
/// 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; } }
}
}

View File

@@ -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();

View File

@@ -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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
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
g91l5xSY+DSuwNda+F7PzloVLGdA7DhvOo7irXclDLy+W1Q2jGC7FsUtOiu7bXQO0WjTi6zCaeMqiseE
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
AAAASUVORK5CYIIL
</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="SharedImageCollection.Timestamp" type="System.DateTime, mscorlib">
<value>05/05/2013 19:32:18</value>
<value>05/11/2013 11:24:15</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="SharedImageCollection.ImageSize" type="System.Drawing.Size, System.Drawing">

View File

@@ -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;
}
}

View File

@@ -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<string> mruFiles = new List<string>();
#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
}
}

View File

@@ -117,6 +117,50 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="gridLeft.EmbeddedNavigator.AccessibleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="gridLeft.EmbeddedNavigator.AccessibleName" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<assembly alias="DevExpress.Data.v12.2" name="DevExpress.Data.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<data name="gridLeft.EmbeddedNavigator.AllowHtmlTextInToolTip" type="DevExpress.Utils.DefaultBoolean, DevExpress.Data.v12.2">
<value>Default</value>
</data>
<data name="gridLeft.EmbeddedNavigator.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left</value>
</data>
<data name="gridLeft.EmbeddedNavigator.BackgroundImage" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="gridLeft.EmbeddedNavigator.BackgroundImageLayout" type="System.Windows.Forms.ImageLayout, System.Windows.Forms">
<value>Tile</value>
</data>
<data name="gridLeft.EmbeddedNavigator.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>Inherit</value>
</data>
<assembly alias="DevExpress.XtraEditors.v12.2" name="DevExpress.XtraEditors.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<data name="gridLeft.EmbeddedNavigator.TextLocation" type="DevExpress.XtraEditors.NavigatorButtonsTextLocation, DevExpress.XtraEditors.v12.2">
<value>Center</value>
</data>
<data name="gridLeft.EmbeddedNavigator.ToolTip" xml:space="preserve">
<value />
</data>
<assembly alias="DevExpress.Utils.v12.2" name="DevExpress.Utils.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<data name="gridLeft.EmbeddedNavigator.ToolTipIconType" type="DevExpress.Utils.ToolTipIconType, DevExpress.Utils.v12.2">
<value>None</value>
</data>
<data name="gridLeft.EmbeddedNavigator.ToolTipTitle" xml:space="preserve">
<value />
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="gviewLeft.Appearance.HeaderPanel.GradientMode" type="System.Drawing.Drawing2D.LinearGradientMode, System.Drawing">
<value>Horizontal</value>
</data>
<data name="gviewLeft.Appearance.HeaderPanel.Image" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="colOutSlot.Caption" xml:space="preserve">
<value>Neue Pr#</value>
</data>
@@ -129,13 +173,34 @@
<data name="colOutFav.Caption" xml:space="preserve">
<value>Favoriten</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit1.Mask.AutoComplete" type="DevExpress.XtraEditors.Mask.AutoCompleteType, DevExpress.XtraEditors.v12.2">
<value>Default</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="repositoryItemCheckedComboBoxEdit1.Mask.BeepOnError" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit1.Mask.IgnoreMaskBlank" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit1.Mask.PlaceHolder" type="System.Char, mscorlib" xml:space="preserve">
<value>_</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit1.Mask.SaveLiteral" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit1.Mask.ShowPlaceHolders" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit1.Mask.UseMaskAsDisplayFormat" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="colOutLock.Caption" xml:space="preserve">
<value>Ge- sperrt</value>
</data>
<data name="colOutLock.ToolTip" xml:space="preserve">
<value>Kindersicherung</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="lblHotkeyLeft.Size" type="System.Drawing.Size, System.Drawing">
<value>333, 17</value>
</data>
@@ -166,12 +231,15 @@
<data name="miOpenReferenceFile.Caption" xml:space="preserve">
<value>Referenzliste öffnen...</value>
</data>
<data name="miQuit.Caption" xml:space="preserve">
<value>&amp;Beenden</value>
</data>
<data name="miSaveReferenceFile.Caption" xml:space="preserve">
<value>Referenzliste speichern</value>
</data>
<data name="miExcelExport.Caption" xml:space="preserve">
<value>Excel liste exportieren...</value>
</data>
<data name="miQuit.Caption" xml:space="preserve">
<value>&amp;Beenden</value>
</data>
<data name="miEdit.Caption" xml:space="preserve">
<value>&amp;Bearbeiten</value>
</data>
@@ -220,9 +288,6 @@
<data name="miTvSettings.Caption" xml:space="preserve">
<value>Geräte&amp;einstellungen...</value>
</data>
<data name="miEraseChannelData.Caption" xml:space="preserve">
<value>Alle Senderdaten löschen</value>
</data>
<data name="mnuOptions.Caption" xml:space="preserve">
<value>&amp;Einstellungen</value>
</data>
@@ -238,12 +303,6 @@
<data name="miShowWarningsAfterLoad.Hint" xml:space="preserve">
<value>Eventuelle Warnungen nach dem Laden einer TV-Datei automatisch anzeigen</value>
</data>
<data name="miEraseDuplicateChannels.Caption" xml:space="preserve">
<value>TV-Datei automatisch bereinigen</value>
</data>
<data name="miEraseDuplicateChannels.Hint" xml:space="preserve">
<value>Nicht verwendete Senderdaten beim Laden der Datei automatisch entfernen</value>
</data>
<data name="mnuHelp.Caption" xml:space="preserve">
<value>&amp;Hilfe</value>
</data>
@@ -294,24 +353,126 @@
WIeWYGkVXQEL
</value>
</data>
<data name="barDockControlTop.Appearance.GradientMode" type="System.Drawing.Drawing2D.LinearGradientMode, System.Drawing">
<value>Horizontal</value>
</data>
<data name="barDockControlTop.Appearance.Image" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="barDockControlBottom.Appearance.GradientMode" type="System.Drawing.Drawing2D.LinearGradientMode, System.Drawing">
<value>Horizontal</value>
</data>
<data name="barDockControlBottom.Appearance.Image" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="barDockControlLeft.Appearance.GradientMode" type="System.Drawing.Drawing2D.LinearGradientMode, System.Drawing">
<value>Horizontal</value>
</data>
<data name="barDockControlLeft.Appearance.Image" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="barDockControlRight.Appearance.GradientMode" type="System.Drawing.Drawing2D.LinearGradientMode, System.Drawing">
<value>Horizontal</value>
</data>
<data name="barDockControlRight.Appearance.Image" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="miMoveUp.Caption" xml:space="preserve">
<value>Nach oben</value>
</data>
<data name="miMoveDown.Caption" xml:space="preserve">
<value>Nach unten</value>
</data>
<data name="rbInsertSwap.Properties.AccessibleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="rbInsertSwap.Properties.AccessibleName" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="rbInsertSwap.Properties.Appearance.GradientMode" type="System.Drawing.Drawing2D.LinearGradientMode, System.Drawing">
<value>Horizontal</value>
</data>
<data name="rbInsertSwap.Properties.Appearance.Image" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="rbInsertSwap.Properties.AutoHeight" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="rbInsertSwap.Properties.Caption" xml:space="preserve">
<value>tauschen</value>
</data>
<data name="rbInsertSwap.Properties.DisplayValueChecked" xml:space="preserve">
<value />
</data>
<data name="rbInsertSwap.Properties.DisplayValueGrayed" xml:space="preserve">
<value />
</data>
<data name="rbInsertSwap.Properties.DisplayValueUnchecked" xml:space="preserve">
<value />
</data>
<data name="rbInsertAfter.Properties.AccessibleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="rbInsertAfter.Properties.AccessibleName" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="rbInsertAfter.Properties.AutoHeight" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="rbInsertAfter.Properties.Caption" xml:space="preserve">
<value>dahinter</value>
</data>
<data name="rbInsertAfter.Properties.DisplayValueChecked" xml:space="preserve">
<value />
</data>
<data name="rbInsertAfter.Properties.DisplayValueGrayed" xml:space="preserve">
<value />
</data>
<data name="rbInsertAfter.Properties.DisplayValueUnchecked" xml:space="preserve">
<value />
</data>
<data name="rbInsertBefore.Properties.AccessibleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="rbInsertBefore.Properties.AccessibleName" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="rbInsertBefore.Properties.AutoHeight" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="rbInsertBefore.Properties.Caption" xml:space="preserve">
<value>davor</value>
</data>
<data name="rbInsertBefore.Properties.DisplayValueChecked" xml:space="preserve">
<value />
</data>
<data name="rbInsertBefore.Properties.DisplayValueGrayed" xml:space="preserve">
<value />
</data>
<data name="rbInsertBefore.Properties.DisplayValueUnchecked" xml:space="preserve">
<value />
</data>
<data name="cbCloseGap.Properties.AccessibleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="cbCloseGap.Properties.AccessibleName" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="cbCloseGap.Properties.AutoHeight" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="cbCloseGap.Properties.Caption" xml:space="preserve">
<value>Lücken beim Verschieben/Entfernen von Sendern schließen</value>
</data>
<data name="cbCloseGap.Properties.DisplayValueChecked" xml:space="preserve">
<value />
</data>
<data name="cbCloseGap.Properties.DisplayValueGrayed" xml:space="preserve">
<value />
</data>
<data name="cbCloseGap.Properties.DisplayValueUnchecked" xml:space="preserve">
<value />
</data>
<data name="cbCloseGap.ToolTip" xml:space="preserve">
<value>Wenn aktiv, werden folgende Programmnummer automatisch vorgerückt</value>
</data>
@@ -321,6 +482,18 @@
<data name="labelControl2.Text" xml:space="preserve">
<value>Einfügemodus:</value>
</data>
<data name="picDonate.Properties.AccessibleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="picDonate.Properties.AccessibleName" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="picDonate.Properties.Appearance.GradientMode" type="System.Drawing.Drawing2D.LinearGradientMode, System.Drawing">
<value>Horizontal</value>
</data>
<data name="picDonate.Properties.Appearance.Image" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="pageEmpty.Text" xml:space="preserve">
<value>Keine Datei geladen</value>
</data>
@@ -330,12 +503,54 @@
<data name="labelControl11.ToolTip" xml:space="preserve">
<value>Programplatz für Einfügen und Festlegen</value>
</data>
<data name="txtSetSlot.Properties.AccessibleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="txtSetSlot.Properties.AccessibleName" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="txtSetSlot.Properties.AutoHeight" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="txtSetSlot.Properties.Mask.AutoComplete" type="DevExpress.XtraEditors.Mask.AutoCompleteType, DevExpress.XtraEditors.v12.2">
<value>Default</value>
</data>
<data name="txtSetSlot.Properties.Mask.BeepOnError" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="txtSetSlot.Properties.Mask.IgnoreMaskBlank" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="txtSetSlot.Properties.Mask.PlaceHolder" type="System.Char, mscorlib" xml:space="preserve">
<value>_</value>
</data>
<data name="txtSetSlot.Properties.Mask.SaveLiteral" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="txtSetSlot.Properties.Mask.ShowPlaceHolders" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="txtSetSlot.Properties.Mask.UseMaskAsDisplayFormat" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="txtSetSlot.Properties.NullValuePrompt" xml:space="preserve">
<value />
</data>
<data name="txtSetSlot.Properties.NullValuePromptShowForEmptyValue" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>ChanSort {0} - Senderlisten-Editor für Samsung, LG und Toshiba TVs</value>
</data>
<data name="btnToggleLock.Text" xml:space="preserve">
<value>Kindersicherung</value>
</data>
<data name="btnClearLeftFilter.Appearance.GradientMode" type="System.Drawing.Drawing2D.LinearGradientMode, System.Drawing">
<value>Horizontal</value>
</data>
<data name="btnClearLeftFilter.Appearance.Image" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="btnClearLeftFilter.ToolTip" xml:space="preserve">
<value>Filter entfernen</value>
</data>
@@ -351,6 +566,45 @@
<data name="grpOutputList.Text" xml:space="preserve">
<value>Sortierte Sender (.csv)</value>
</data>
<data name="gridRight.EmbeddedNavigator.AccessibleDescription" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="gridRight.EmbeddedNavigator.AccessibleName" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="gridRight.EmbeddedNavigator.AllowHtmlTextInToolTip" type="DevExpress.Utils.DefaultBoolean, DevExpress.Data.v12.2">
<value>Default</value>
</data>
<data name="gridRight.EmbeddedNavigator.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left</value>
</data>
<data name="gridRight.EmbeddedNavigator.BackgroundImage" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="gridRight.EmbeddedNavigator.BackgroundImageLayout" type="System.Windows.Forms.ImageLayout, System.Windows.Forms">
<value>Tile</value>
</data>
<data name="gridRight.EmbeddedNavigator.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>Inherit</value>
</data>
<data name="gridRight.EmbeddedNavigator.TextLocation" type="DevExpress.XtraEditors.NavigatorButtonsTextLocation, DevExpress.XtraEditors.v12.2">
<value>Center</value>
</data>
<data name="gridRight.EmbeddedNavigator.ToolTip" xml:space="preserve">
<value />
</data>
<data name="gridRight.EmbeddedNavigator.ToolTipIconType" type="DevExpress.Utils.ToolTipIconType, DevExpress.Utils.v12.2">
<value>None</value>
</data>
<data name="gridRight.EmbeddedNavigator.ToolTipTitle" xml:space="preserve">
<value />
</data>
<data name="gviewRight.Appearance.HeaderPanel.GradientMode" type="System.Drawing.Drawing2D.LinearGradientMode, System.Drawing">
<value>Horizontal</value>
</data>
<data name="gviewRight.Appearance.HeaderPanel.Image" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="colSlotOld.Caption" xml:space="preserve">
<value>Alte Pr#</value>
</data>
@@ -372,6 +626,27 @@
<data name="colFavorites.Caption" xml:space="preserve">
<value>Favoriten</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit2.Mask.AutoComplete" type="DevExpress.XtraEditors.Mask.AutoCompleteType, DevExpress.XtraEditors.v12.2">
<value>Default</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit2.Mask.BeepOnError" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit2.Mask.IgnoreMaskBlank" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit2.Mask.PlaceHolder" type="System.Char, mscorlib" xml:space="preserve">
<value>_</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit2.Mask.SaveLiteral" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit2.Mask.ShowPlaceHolders" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="repositoryItemCheckedComboBoxEdit2.Mask.UseMaskAsDisplayFormat" type="System.Boolean, mscorlib">
<value>False</value>
</data>
<data name="colLock.Caption" xml:space="preserve">
<value>Ge- sperrt</value>
</data>
@@ -426,6 +701,12 @@
<data name="btnAddAll.ToolTip" xml:space="preserve">
<value>Aller derzeit nicht sortierten Sender ans Ende der Liste anhängen</value>
</data>
<data name="btnClearRightFilter.Appearance.GradientMode" type="System.Drawing.Drawing2D.LinearGradientMode, System.Drawing">
<value>Horizontal</value>
</data>
<data name="btnClearRightFilter.Appearance.Image" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="btnClearRightFilter.ToolTip" xml:space="preserve">
<value>Filter entfernen</value>
</data>

View File

@@ -123,7 +123,7 @@
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="splitContainerControl1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 109</value>
<value>0, 88</value>
</data>
<metadata name="dsChannels.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>361, 17</value>
@@ -222,7 +222,7 @@
<value>35</value>
</data>
<data name="gridLeft.Size" type="System.Drawing.Size, System.Drawing">
<value>382, 417</value>
<value>382, 438</value>
</data>
<data name="gridLeft.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
@@ -243,7 +243,7 @@
<value>Bottom</value>
</data>
<data name="lblHotkeyLeft.Location" type="System.Drawing.Point, System.Drawing">
<value>2, 471</value>
<value>2, 492</value>
</data>
<data name="lblHotkeyLeft.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>2, 2, 2, 2</value>
@@ -282,7 +282,7 @@
<value>1474, 599</value>
</data>
<data name="rbInsertSwap.Location" type="System.Drawing.Point, System.Drawing">
<value>5, 24</value>
<value>218, 6</value>
</data>
<metadata name="barManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>475, 17</value>
@@ -314,9 +314,15 @@
<data name="miSaveReferenceFile.Caption" xml:space="preserve">
<value>Save reference list</value>
</data>
<data name="miExcelExport.Caption" xml:space="preserve">
<value>Export Excel list...</value>
</data>
<data name="miQuit.Caption" xml:space="preserve">
<value>&amp;Quit</value>
</data>
<data name="miRecentFiles.Caption" xml:space="preserve">
<value>miRecentFiles</value>
</data>
<data name="miEdit.Caption" xml:space="preserve">
<value>&amp;Edit</value>
</data>
@@ -371,14 +377,11 @@
<data name="miTvSettings.Caption" xml:space="preserve">
<value>Device setting...</value>
</data>
<data name="miEraseChannelData.Caption" xml:space="preserve">
<value>Erase all channel data</value>
</data>
<data name="miCleanupChannels.Caption" xml:space="preserve">
<value>Cleanup channel data</value>
</data>
<data name="miCleanupChannels.Hint" xml:space="preserve">
<value>Remove duplicate channels and reorganize </value>
<value>Reorganize channel records and remove duplicates</value>
</data>
<data name="mnuOptions.Caption" xml:space="preserve">
<value>&amp;Settings</value>
@@ -404,12 +407,6 @@
<data name="miShowWarningsAfterLoad.Caption" xml:space="preserve">
<value>Show warnings after loading file</value>
</data>
<data name="miEraseDuplicateChannels.Caption" xml:space="preserve">
<value>Cleanup TV data file after loading</value>
</data>
<data name="miEraseDuplicateChannels.Hint" xml:space="preserve">
<value>Automatically clean up TV data file after loading</value>
</data>
<data name="mnuHelp.Caption" xml:space="preserve">
<value>&amp;Help</value>
</data>
@@ -561,7 +558,7 @@
</data>
<assembly alias="DevExpress.Data.v12.2" name="DevExpress.Data.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<data name="rbInsertSwap.Properties.GlyphAlignment" type="DevExpress.Utils.HorzAlignment, DevExpress.Data.v12.2">
<value>Far</value>
<value>Default</value>
</data>
<data name="rbInsertSwap.Size" type="System.Drawing.Size, System.Drawing">
<value>77, 19</value>
@@ -585,7 +582,7 @@
<value>True</value>
</data>
<data name="rbInsertAfter.Location" type="System.Drawing.Point, System.Drawing">
<value>88, 24</value>
<value>153, 6</value>
</data>
<data name="rbInsertAfter.Properties.Caption" xml:space="preserve">
<value>after</value>
@@ -609,7 +606,7 @@
<value>1</value>
</data>
<data name="rbInsertBefore.Location" type="System.Drawing.Point, System.Drawing">
<value>88, 5</value>
<value>82, 6</value>
</data>
<data name="rbInsertBefore.Properties.Caption" xml:space="preserve">
<value>before</value>
@@ -636,7 +633,7 @@
<value>True</value>
</data>
<data name="cbCloseGap.Location" type="System.Drawing.Point, System.Drawing">
<value>263, 6</value>
<value>496, 6</value>
</data>
<data name="cbCloseGap.Properties.Caption" xml:space="preserve">
<value>Close gap when moving/deleting a channel</value>
@@ -717,7 +714,7 @@
<value>Bottom, Left</value>
</data>
<data name="tabChannelList.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 54</value>
<value>0, 33</value>
</data>
<data name="pageEmpty.Size" type="System.Drawing.Size, System.Drawing">
<value>632, 0</value>
@@ -759,10 +756,10 @@
<value>Vertical</value>
</data>
<data name="labelControl11.Location" type="System.Drawing.Point, System.Drawing">
<value>169, 8</value>
<value>320, 8</value>
</data>
<data name="labelControl11.Size" type="System.Drawing.Size, System.Drawing">
<value>80, 13</value>
<value>64, 13</value>
</data>
<data name="labelControl11.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -786,7 +783,7 @@
<value>7</value>
</data>
<data name="txtSetSlot.Location" type="System.Drawing.Point, System.Drawing">
<value>169, 24</value>
<value>390, 5</value>
</data>
<data name="txtSetSlot.Properties.Buttons" type="DevExpress.XtraEditors.Controls.ButtonPredefines, DevExpress.Utils.v12.2">
<value>OK</value>
@@ -822,7 +819,7 @@
<value>0, 31</value>
</data>
<data name="grpTopPanel.Size" type="System.Drawing.Size, System.Drawing">
<value>1474, 78</value>
<value>1474, 57</value>
</data>
<data name="grpTopPanel.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -1160,12 +1157,24 @@
<data name="&gt;&gt;miSaveReferenceFile.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;miExcelExport.Name" xml:space="preserve">
<value>miExcelExport</value>
</data>
<data name="&gt;&gt;miExcelExport.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;miQuit.Name" xml:space="preserve">
<value>miQuit</value>
</data>
<data name="&gt;&gt;miQuit.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;miRecentFiles.Name" xml:space="preserve">
<value>miRecentFiles</value>
</data>
<data name="&gt;&gt;miRecentFiles.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarListItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;miEdit.Name" xml:space="preserve">
<value>miEdit</value>
</data>
@@ -1274,10 +1283,10 @@
<data name="&gt;&gt;miTvSettings.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;miEraseChannelData.Name" xml:space="preserve">
<value>miEraseChannelData</value>
<data name="&gt;&gt;miCleanupChannels.Name" xml:space="preserve">
<value>miCleanupChannels</value>
</data>
<data name="&gt;&gt;miEraseChannelData.Type" xml:space="preserve">
<data name="&gt;&gt;miCleanupChannels.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;mnuOptions.Name" xml:space="preserve">
@@ -1328,12 +1337,6 @@
<data name="&gt;&gt;miShowWarningsAfterLoad.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarCheckItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;miEraseDuplicateChannels.Name" xml:space="preserve">
<value>miEraseDuplicateChannels</value>
</data>
<data name="&gt;&gt;miEraseDuplicateChannels.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarCheckItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;mnuHelp.Name" xml:space="preserve">
<value>mnuHelp</value>
</data>
@@ -1370,12 +1373,6 @@
<data name="&gt;&gt;miMoveDown.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;miCleanupChannels.Name" xml:space="preserve">
<value>miCleanupChannels</value>
</data>
<data name="&gt;&gt;miCleanupChannels.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;defaultLookAndFeel1.Name" xml:space="preserve">
<value>defaultLookAndFeel1</value>
</data>
@@ -1407,7 +1404,7 @@
<value>DevExpress.XtraEditors.XtraForm, DevExpress.Utils.v12.2, Version=12.2.8.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="SharedImageCollection.Timestamp" type="System.DateTime, mscorlib">
<value>05/07/2013 01:07:27</value>
<value>05/11/2013 13:20:06</value>
</data>
<data name="SharedImageCollection.ImageSize" type="System.Drawing.Size, System.Drawing">
<value>16, 16</value>
@@ -1722,7 +1719,7 @@
<value>0, 0</value>
</data>
<data name="grpOutputList.Size" type="System.Drawing.Size, System.Drawing">
<value>386, 490</value>
<value>386, 511</value>
</data>
<data name="grpOutputList.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -2052,7 +2049,7 @@
<value>Signal source</value>
</data>
<data name="gridRight.Size" type="System.Drawing.Size, System.Drawing">
<value>1079, 417</value>
<value>1079, 438</value>
</data>
<data name="gridRight.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
@@ -2073,7 +2070,7 @@
<value>Bottom</value>
</data>
<data name="lblHotkeyRight.Location" type="System.Drawing.Point, System.Drawing">
<value>2, 471</value>
<value>2, 492</value>
</data>
<data name="lblHotkeyRight.Padding" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>2, 2, 2, 2</value>
@@ -2241,7 +2238,7 @@
<value>0, 0</value>
</data>
<data name="grpInputList.Size" type="System.Drawing.Size, System.Drawing">
<value>1083, 490</value>
<value>1083, 511</value>
</data>
<data name="grpInputList.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@@ -2265,7 +2262,7 @@
<value>Panel2</value>
</data>
<data name="splitContainerControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>1474, 490</value>
<value>1474, 511</value>
</data>
<data name="splitContainerControl1.TabIndex" type="System.Int32, mscorlib">
<value>5</value>

View File

@@ -96,6 +96,16 @@ namespace ChanSort.Ui.Properties {
}
}
/// <summary>
/// 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..
/// </summary>
internal static string MainForm_ExportExcelList_Message {
get {
return ResourceManager.GetString("MainForm_ExportExcelList_Message", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Supported Files|{0}|All Files (*.*)|*.
/// </summary>
@@ -228,6 +238,24 @@ namespace ChanSort.Ui.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to File not found.
/// </summary>
internal static string MainForm_LoadTvDataFile_FileNotFound_Caption {
get {
return ResourceManager.GetString("MainForm_LoadTvDataFile_FileNotFound_Caption", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to The file {0} does not exist..
/// </summary>
internal static string MainForm_LoadTvDataFile_FileNotFound_Message {
get {
return ResourceManager.GetString("MainForm_LoadTvDataFile_FileNotFound_Message", resourceCulture);
}
}
/// <summary>
/// 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?.

View File

@@ -261,4 +261,14 @@ Möchten Sie die Downloadseite öffnen?</value>
<data name="MainForm_Cancel" xml:space="preserve">
<value>Abbrechen</value>
</data>
<data name="MainForm_LoadTvDataFile_FileNotFound_Caption" xml:space="preserve">
<value>Datei nicht gefunden</value>
</data>
<data name="MainForm_LoadTvDataFile_FileNotFound_Message" xml:space="preserve">
<value>Die Datei {0} konnte nicht gefunden werden.</value>
</data>
<data name="MainForm_ExportExcelList_Message" xml:space="preserve">
<value>Die Senderliste wurde in die Zwischenablage kopiert
und kann nun in Excel oder einen Texteditor eingefügt werden.</value>
</data>
</root>

View File

@@ -260,4 +260,14 @@ Do you want to open the download website?</value>
<data name="MainForm_Cancel" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="MainForm_LoadTvDataFile_FileNotFound_Caption" xml:space="preserve">
<value>File not found</value>
</data>
<data name="MainForm_LoadTvDataFile_FileNotFound_Message" xml:space="preserve">
<value>The file {0} does not exist.</value>
</data>
<data name="MainForm_ExportExcelList_Message" xml:space="preserve">
<value>The channel list has been copied to the clipboard
and can be pasted into Excel or any text editor.</value>
</data>
</root>

View File

@@ -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;
}
}
}
}

View File

@@ -2,9 +2,6 @@
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="ChanSort.Ui.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="InputTLL" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="InputListRowHandle" Type="System.Int32" Scope="User">
<Value Profile="(Default)">0</Value>
</Setting>
@@ -77,5 +74,20 @@
<Setting Name="CloseGaps" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="MruFile0" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="MruFile1" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="MruFile2" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="MruFile3" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="MruFile4" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
</SettingsFile>

View File

@@ -8,9 +8,6 @@
</configSections>
<startup><supportedRuntime version="v2.0.50727"/></startup><userSettings>
<ChanSort.Ui.Properties.Settings>
<setting name="InputTLL" serializeAs="String">
<value />
</setting>
<setting name="InputListRowHandle" serializeAs="String">
<value>0</value>
</setting>
@@ -83,6 +80,21 @@
<setting name="CloseGaps" serializeAs="String">
<value>True</value>
</setting>
<setting name="MruFile0" serializeAs="String">
<value />
</setting>
<setting name="MruFile1" serializeAs="String">
<value />
</setting>
<setting name="MruFile2" serializeAs="String">
<value />
</setting>
<setting name="MruFile3" serializeAs="String">
<value />
</setting>
<setting name="MruFile4" serializeAs="String">
<value />
</setting>
</ChanSort.Ui.Properties.Settings>
<GUI.Properties.Settings>
<setting name="InputTLL" serializeAs="String">

View File

@@ -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");
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -88,6 +88,7 @@
<Compile Include="TestBase.cs" />
<Compile Include="LH\TestLH.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="DvbsCleanup\TestDvbsCleanup.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />

View File

@@ -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

View File

@@ -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;

View File

@@ -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.