├── .editorconfig ├── .gitattributes ├── .gitignore ├── Fetitor.sln ├── Fetitor ├── FeaturesFile.cs ├── Fetitor.csproj ├── FrmAbout.Designer.cs ├── FrmAbout.cs ├── FrmAbout.resx ├── FrmMain.Designer.cs ├── FrmMain.cs ├── FrmMain.resx ├── FrmSearch.Designer.cs ├── FrmSearch.cs ├── FrmSearch.resx ├── FrmUpdateFeatureNames.Designer.cs ├── FrmUpdateFeatureNames.cs ├── FrmUpdateFeatureNames.resx ├── MyScintilla.cs ├── Program.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── ToolStripRendererNL.cs ├── app.config ├── features.txt └── icon.ico ├── LICENSE.md ├── Lib └── jacobslusser.ScintillaNET.3.2.0-rc │ ├── LICENSE │ ├── ScintillaNET.dll │ └── ScintillaNET.xml ├── README.md ├── icon.ico ├── icon.png └── preview.png /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Code files 7 | [*.{cs,csx,vb,vbx}] 8 | indent_style = tab 9 | indent_size = 4 10 | insert_final_newline = true 11 | #charset = utf-8-bom 12 | 13 | # Xml project files 14 | [*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}] 15 | indent_style = space 16 | indent_size = 2 17 | 18 | # Xml config files 19 | [*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}] 20 | indent_style = space 21 | indent_size = 2 22 | 23 | # JSON files 24 | [*.json] 25 | indent_style = tab 26 | indent_size = 4 27 | 28 | # Dotnet code style settings: 29 | [*.{cs,vb}] 30 | # Sort using and Import directives with System.* appearing first 31 | dotnet_sort_system_directives_first = true 32 | dotnet_style_qualification_for_field = true:none # only for public fields 33 | dotnet_style_qualification_for_property = true:suggestion 34 | dotnet_style_qualification_for_method = true:suggestion 35 | dotnet_style_qualification_for_event = true:suggestion 36 | 37 | # Use language keywords instead of framework type names for type references 38 | dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion 39 | dotnet_style_predefined_type_for_member_access = true:suggestion 40 | 41 | # Suggest more modern language features when available 42 | dotnet_style_object_initializer = false:suggestion 43 | dotnet_style_collection_initializer = false:suggestion 44 | dotnet_style_coalesce_expression = true:suggestion 45 | dotnet_style_null_propagation = true:suggestion 46 | dotnet_style_explicit_tuple_names = true:suggestion 47 | 48 | # Static fields 49 | dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion 50 | dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields 51 | dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style 52 | 53 | dotnet_naming_symbols.static_fields.applicable_kinds = field 54 | dotnet_naming_symbols.static_fields.required_modifiers = static 55 | 56 | dotnet_naming_style.static_prefix_style.capitalization = pascal_case 57 | 58 | # Internal and private fields 59 | dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion 60 | dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields 61 | dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style 62 | 63 | dotnet_naming_symbols.private_internal_fields.applicable_kinds = field 64 | dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal 65 | 66 | dotnet_naming_style.camel_case_underscore_style.required_prefix = _ 67 | dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case 68 | 69 | # CSharp code style settings: 70 | [*.cs] 71 | # Prefer "var" everywhere 72 | csharp_style_var_for_built_in_types = true:suggestion 73 | csharp_style_var_when_type_is_apparent = true:suggestion 74 | csharp_style_var_elsewhere = true:suggestion 75 | 76 | # Prefer method-like constructs to have a block body 77 | csharp_style_expression_bodied_methods = false:none 78 | csharp_style_expression_bodied_constructors = false:none 79 | csharp_style_expression_bodied_operators = false:none 80 | 81 | # Prefer property-like constructs to have an expression-body 82 | csharp_style_expression_bodied_properties = true:none 83 | csharp_style_expression_bodied_indexers = true:none 84 | csharp_style_expression_bodied_accessors = true:none 85 | 86 | # Suggest more modern language features when available 87 | csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion 88 | csharp_style_pattern_matching_over_as_with_null_check = true:suggestion 89 | csharp_style_inlined_variable_declaration = true:suggestion 90 | csharp_style_throw_expression = true:suggestion 91 | csharp_style_conditional_delegate_call = true:suggestion 92 | 93 | # Newline settings 94 | csharp_new_line_before_open_brace = all 95 | csharp_new_line_before_else = true 96 | csharp_new_line_before_catch = true 97 | csharp_new_line_before_finally = true 98 | csharp_new_line_before_members_in_object_initializers = true 99 | csharp_new_line_before_members_in_anonymous_types = true 100 | 101 | # Labels 102 | csharp_indent_labels = one_less_than_current 103 | 104 | # Object initializer 105 | csharp_style_object_initializer = false 106 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | .vs/ 10 | 11 | # Build results 12 | [Dd]ebug/ 13 | [Dd]ebugPublic/ 14 | [Rr]elease/ 15 | [Rr]eleases/ 16 | x64/ 17 | x86/ 18 | build/ 19 | bld/ 20 | [Bb]in/ 21 | [Oo]bj/ 22 | 23 | # Roslyn cache directories 24 | *.ide/ 25 | 26 | # MSTest test Results 27 | [Tt]est[Rr]esult*/ 28 | [Bb]uild[Ll]og.* 29 | 30 | #NUNIT 31 | *.VisualState.xml 32 | TestResult.xml 33 | 34 | # Build Results of an ATL Project 35 | [Dd]ebugPS/ 36 | [Rr]eleasePS/ 37 | dlldata.c 38 | 39 | *_i.c 40 | *_p.c 41 | *_i.h 42 | *.ilk 43 | *.meta 44 | *.obj 45 | *.pch 46 | *.pdb 47 | *.pgc 48 | *.pgd 49 | *.rsp 50 | *.sbr 51 | *.tlb 52 | *.tli 53 | *.tlh 54 | *.tmp 55 | *.tmp_proj 56 | *.log 57 | *.vspscc 58 | *.vssscc 59 | .builds 60 | *.pidb 61 | *.svclog 62 | *.scc 63 | 64 | # Chutzpah Test files 65 | _Chutzpah* 66 | 67 | # Visual C++ cache files 68 | ipch/ 69 | *.aps 70 | *.ncb 71 | *.opensdf 72 | *.sdf 73 | *.cachefile 74 | 75 | # Visual Studio profiler 76 | *.psess 77 | *.vsp 78 | *.vspx 79 | 80 | # TFS 2012 Local Workspace 81 | $tf/ 82 | 83 | # Guidance Automation Toolkit 84 | *.gpState 85 | 86 | # ReSharper is a .NET coding add-in 87 | _ReSharper*/ 88 | *.[Rr]e[Ss]harper 89 | *.DotSettings.user 90 | 91 | # JustCode is a .NET coding addin-in 92 | .JustCode 93 | 94 | # TeamCity is a build add-in 95 | _TeamCity* 96 | 97 | # DotCover is a Code Coverage Tool 98 | *.dotCover 99 | 100 | # NCrunch 101 | _NCrunch_* 102 | .*crunch*.local.xml 103 | 104 | # MightyMoose 105 | *.mm.* 106 | AutoTest.Net/ 107 | 108 | # Web workbench (sass) 109 | .sass-cache/ 110 | 111 | # Installshield output folder 112 | [Ee]xpress/ 113 | 114 | # DocProject is a documentation generator add-in 115 | DocProject/buildhelp/ 116 | DocProject/Help/*.HxT 117 | DocProject/Help/*.HxC 118 | DocProject/Help/*.hhc 119 | DocProject/Help/*.hhk 120 | DocProject/Help/*.hhp 121 | DocProject/Help/Html2 122 | DocProject/Help/html 123 | 124 | # Click-Once directory 125 | publish/ 126 | 127 | # Publish Web Output 128 | *.[Pp]ublish.xml 129 | *.azurePubxml 130 | # TODO: Comment the next line if you want to checkin your web deploy settings 131 | # but database connection strings (with potential passwords) will be unencrypted 132 | *.pubxml 133 | *.publishproj 134 | 135 | # NuGet Packages 136 | *.nupkg 137 | # The packages folder can be ignored because of Package Restore 138 | **/packages/* 139 | # except build/, which is used as an MSBuild target. 140 | !**/packages/build/ 141 | # If using the old MSBuild-Integrated Package Restore, uncomment this: 142 | #!**/packages/repositories.config 143 | 144 | # Windows Azure Build Output 145 | csx/ 146 | *.build.csdef 147 | 148 | # Windows Store app package directory 149 | AppPackages/ 150 | 151 | # Others 152 | sql/ 153 | *.Cache 154 | ClientBin/ 155 | [Ss]tyle[Cc]op.* 156 | ~$* 157 | *~ 158 | *.dbmdl 159 | *.dbproj.schemaview 160 | *.pfx 161 | *.publishsettings 162 | node_modules/ 163 | 164 | # RIA/Silverlight projects 165 | Generated_Code/ 166 | 167 | # Backup & report files from converting an old project file 168 | # to a newer Visual Studio version. Backup files are not needed, 169 | # because we have git ;-) 170 | _UpgradeReport_Files/ 171 | Backup*/ 172 | UpgradeLog*.XML 173 | UpgradeLog*.htm 174 | 175 | # SQL Server files 176 | *.mdf 177 | *.ldf 178 | 179 | # Business Intelligence projects 180 | *.rdl.data 181 | *.bim.layout 182 | *.bim_*.settings 183 | 184 | # Microsoft Fakes 185 | FakesAssemblies/ 186 | 187 | # ========================= 188 | # Operating System Files 189 | # ========================= 190 | 191 | # OSX 192 | # ========================= 193 | 194 | .DS_Store 195 | .AppleDouble 196 | .LSOverride 197 | 198 | # Thumbnails 199 | ._* 200 | 201 | # Files that might appear on external disk 202 | .Spotlight-V100 203 | .Trashes 204 | 205 | # Directories potentially created on remote AFP share 206 | .AppleDB 207 | .AppleDesktop 208 | Network Trash Folder 209 | Temporary Items 210 | .apdisk 211 | 212 | # Windows 213 | # ========================= 214 | 215 | # Windows image file caches 216 | Thumbs.db 217 | ehthumbs.db 218 | 219 | # Folder config file 220 | Desktop.ini 221 | 222 | # Recycle Bin used on file shares 223 | $RECYCLE.BIN/ 224 | 225 | # Windows Installer files 226 | *.cab 227 | *.msi 228 | *.msm 229 | *.msp 230 | 231 | # Windows shortcuts 232 | *.lnk 233 | -------------------------------------------------------------------------------- /Fetitor.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.31101.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fetitor", "Fetitor\Fetitor.csproj", "{96BC212F-1ED2-4214-8A1C-35543C2B1AC8}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {96BC212F-1ED2-4214-8A1C-35543C2B1AC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {96BC212F-1ED2-4214-8A1C-35543C2B1AC8}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {96BC212F-1ED2-4214-8A1C-35543C2B1AC8}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {96BC212F-1ED2-4214-8A1C-35543C2B1AC8}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /Fetitor/FeaturesFile.cs: -------------------------------------------------------------------------------- 1 | // This program is free software: you can redistribute it and/or modify 2 | // it under the terms of the GNU General Public License as published by 3 | // the Free Software Foundation, either version 3 of the License, or 4 | // (at your option) any later version. 5 | // 6 | // This program is distributed in the hope that it will be useful, 7 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 8 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 | // GNU General Public License for more details. 10 | // 11 | // You should have received a copy of the GNU General Public License 12 | // along with this program. If not, see . 13 | 14 | using System; 15 | using System.Collections.Generic; 16 | using System.IO; 17 | using System.Text; 18 | using System.Xml; 19 | 20 | namespace Fetitor 21 | { 22 | /// 23 | /// Represents "Setting" entry in "features.xml.compiled". 24 | /// 25 | public class FeaturesSetting 26 | { 27 | public bool Development; 28 | public byte Generation; 29 | public string Locale = ""; 30 | public string Name = ""; 31 | public byte Season; 32 | public byte Subseason; 33 | public bool Test; 34 | } 35 | 36 | /// 37 | /// Represents "Feature" entry in "features.xml.compiled". 38 | /// 39 | public class FeaturesFeature 40 | { 41 | public string Default = ""; 42 | public string Disable = ""; 43 | public string Enable = ""; 44 | public string StartTime = null; 45 | public string EndTime = null; 46 | public uint Hash; 47 | public string Name; 48 | } 49 | 50 | /// 51 | /// Reader and writer for features.xml(.compiled). 52 | /// 53 | public class FeaturesFile 54 | { 55 | private int _formatVersion = 0; 56 | 57 | private readonly byte[] _strBuffer = new byte[0x100]; 58 | 59 | private readonly List _settings = new List(); 60 | private readonly List _features = new List(); 61 | 62 | private static readonly Dictionary _featureNames = new Dictionary(); 63 | private static readonly HashSet _completeFeatureNames = new HashSet(); 64 | 65 | /// 66 | /// Returns the number of features names loaded. 67 | /// 68 | public static int FetureNameCount => _completeFeatureNames.Count; 69 | 70 | /// 71 | /// Creates new FeaturesFile. 72 | /// 73 | public FeaturesFile() 74 | { 75 | } 76 | 77 | /// 78 | /// Creates new FeaturesFile from file. 79 | /// 80 | /// 81 | private FeaturesFile(string filePath) 82 | { 83 | if (!File.Exists(filePath)) 84 | throw new FileNotFoundException("File not found: " + filePath); 85 | 86 | var ext = Path.GetExtension(filePath); 87 | if (ext != ".xml" && ext != ".compiled") 88 | throw new InvalidDataException("Invalid file extension."); 89 | 90 | using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 91 | { 92 | if (ext == ".xml") 93 | this.LoadFromXml(stream); 94 | else 95 | this.LoadFromCompiled(stream); 96 | } 97 | } 98 | 99 | /// 100 | /// Loads features names from text file. 101 | /// 102 | /// 103 | public static void LoadFeatureNames(string filePath) 104 | { 105 | using (var sr = new StreamReader(filePath)) 106 | { 107 | string line = null; 108 | while ((line = sr.ReadLine()) != null) 109 | { 110 | var name = line.Trim(); 111 | if (name == "" || name.StartsWith("//")) 112 | continue; 113 | 114 | var hash = GetStringHash(name); 115 | 116 | _featureNames[hash] = name; 117 | _completeFeatureNames.Add(name); 118 | } 119 | } 120 | } 121 | 122 | /// 123 | /// Hashes str. 124 | /// 125 | /// 126 | /// 127 | public static uint GetStringHash(string str) 128 | { 129 | var s = 5381; 130 | foreach (var ch in str) s = s * 33 + (int)ch; 131 | return (uint)s; 132 | } 133 | 134 | /// 135 | /// Loads settings and features from .xml file. 136 | /// 137 | /// 138 | public void LoadFromXml(string filePath) 139 | { 140 | using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 141 | this.LoadFromXml(stream); 142 | } 143 | 144 | /// 145 | /// Loads settings and features from .xml file. 146 | /// 147 | /// 148 | public void LoadFromXml(Stream stream) 149 | { 150 | using (var xml = XmlReader.Create(stream)) 151 | { 152 | xml.ReadToFollowing("Settings"); 153 | using (var settingsXml = xml.ReadSubtree()) 154 | { 155 | while (settingsXml.ReadToFollowing("Setting")) 156 | { 157 | var setting = new FeaturesSetting(); 158 | setting.Name = settingsXml.GetAttribute("Name"); 159 | setting.Locale = settingsXml.GetAttribute("Locale"); 160 | setting.Test = Convert.ToBoolean(settingsXml.GetAttribute("Test")); 161 | setting.Development = Convert.ToBoolean(settingsXml.GetAttribute("Development")); 162 | setting.Generation = Convert.ToByte(settingsXml.GetAttribute("Generation")); 163 | setting.Season = Convert.ToByte(settingsXml.GetAttribute("Season")); 164 | setting.Subseason = Convert.ToByte(settingsXml.GetAttribute("Subseason")); 165 | 166 | _settings.Add(setting); 167 | } 168 | } 169 | 170 | xml.ReadToFollowing("Features"); 171 | using (var featuresXml = xml.ReadSubtree()) 172 | { 173 | while (featuresXml.ReadToFollowing("Feature")) 174 | { 175 | var feature = new FeaturesFeature(); 176 | feature.Hash = Convert.ToUInt32(featuresXml.GetAttribute("Hash") ?? featuresXml.GetAttribute("_Name"), 16); 177 | feature.Name = featuresXml.GetAttribute("Hash") != null ? featuresXml.GetAttribute("Name") : featuresXml.GetAttribute("_RealName"); 178 | feature.Default = featuresXml.GetAttribute("Default"); 179 | feature.Enable = featuresXml.GetAttribute("Enable"); 180 | feature.Disable = featuresXml.GetAttribute("Disable"); 181 | 182 | var startTime = featuresXml.GetAttribute("StartTime"); 183 | var endTime = featuresXml.GetAttribute("EndTime"); 184 | if (startTime != null || endTime != null) 185 | { 186 | feature.StartTime = startTime; 187 | feature.EndTime = endTime; 188 | } 189 | 190 | _features.Add(feature); 191 | } 192 | } 193 | } 194 | } 195 | 196 | /// 197 | /// Saves loaded settings and features in XML format. 198 | /// 199 | /// 200 | public void SaveAsXml(string filePath) 201 | { 202 | using (var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) 203 | this.SaveAsXml(fs); 204 | } 205 | 206 | /// 207 | /// Returns settings and features in XML format. 208 | /// 209 | /// 210 | public string GetXml() 211 | { 212 | using (var ms = new MemoryStream()) 213 | { 214 | this.SaveAsXml(ms); 215 | return Encoding.UTF8.GetString(ms.ToArray()); 216 | } 217 | } 218 | 219 | /// 220 | /// Returns compiled features file in XML format. 221 | /// 222 | /// 223 | /// 224 | public static string GetXmlFromCompiled(string filePath) 225 | { 226 | var ff = new FeaturesFile(filePath); 227 | return ff.GetXml(); 228 | } 229 | 230 | /// 231 | /// Saves given XML file at path in compiled format. 232 | /// 233 | /// 234 | /// 235 | public static void SaveCompiledFromXml(string filePath, string xml) 236 | { 237 | var ff = new FeaturesFile(); 238 | 239 | using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(xml))) 240 | ff.LoadFromXml(ms); 241 | 242 | ff.SaveAsCompiled(filePath); 243 | } 244 | 245 | /// 246 | /// Saves loaded settings and features in XML format. 247 | /// 248 | /// 249 | public void SaveAsXml(Stream stream) 250 | { 251 | using (var writer = XmlWriter.Create(stream, new XmlWriterSettings { Indent = true, IndentChars = "\t" })) 252 | { 253 | writer.WriteStartDocument(); 254 | { 255 | writer.WriteStartElement("FeatureList"); 256 | { 257 | writer.WriteStartElement("Settings"); 258 | foreach (var setting in _settings) 259 | { 260 | writer.WriteStartElement("Setting"); 261 | writer.WriteAttributeString("Name", setting.Name); 262 | writer.WriteAttributeString("Locale", setting.Locale); 263 | writer.WriteAttributeString("Test", setting.Test.ToString()); 264 | writer.WriteAttributeString("Development", setting.Development.ToString()); 265 | writer.WriteAttributeString("Generation", setting.Generation.ToString()); 266 | writer.WriteAttributeString("Season", setting.Season.ToString()); 267 | writer.WriteAttributeString("Subseason", setting.Subseason.ToString()); 268 | writer.WriteEndElement(); 269 | } 270 | writer.WriteEndElement(); 271 | 272 | writer.WriteStartElement("Features"); 273 | foreach (var feature in _features) 274 | { 275 | writer.WriteStartElement("Feature"); 276 | writer.WriteAttributeString("Hash", feature.Hash.ToString("x8")); 277 | writer.WriteAttributeString("Name", feature.Name); 278 | writer.WriteAttributeString("Default", feature.Default); 279 | writer.WriteAttributeString("Enable", feature.Enable); 280 | writer.WriteAttributeString("Disable", feature.Disable); 281 | 282 | if (feature.StartTime != null || feature.EndTime != null) 283 | { 284 | writer.WriteAttributeString("StartTime", feature.StartTime); 285 | writer.WriteAttributeString("EndTime", feature.EndTime); 286 | } 287 | 288 | writer.WriteEndElement(); 289 | } 290 | writer.WriteEndElement(); 291 | } 292 | writer.WriteEndElement(); 293 | } 294 | writer.WriteEndDocument(); 295 | writer.Close(); 296 | } 297 | } 298 | 299 | /// 300 | /// Loads settings and features from compiled file. 301 | /// 302 | /// 303 | private void LoadFromCompiled(string filePath) 304 | { 305 | using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 306 | this.LoadFromCompiled(stream); 307 | } 308 | 309 | /// 310 | /// Loads settings and features from compiled file. 311 | /// 312 | /// Yiting 313 | /// 314 | private void LoadFromCompiled(Stream stream) 315 | { 316 | var buffer = new byte[0x100]; 317 | 318 | if (stream.Read(buffer, 0, 2) != 2) 319 | throw new EndOfStreamException(); 320 | 321 | var settingCount = BitConverter.ToUInt16(buffer, 0); 322 | for (var i = 0; i < settingCount; i++) 323 | { 324 | var setting = new FeaturesSetting(); 325 | 326 | setting.Name = this.ReadEncryptedLpString(stream); 327 | setting.Locale = this.ReadEncryptedLpString(stream); 328 | 329 | if (stream.Read(buffer, 0, 3) != 3) 330 | throw new EndOfStreamException(); 331 | 332 | setting.Generation = buffer[0]; 333 | setting.Season = buffer[1]; 334 | setting.Subseason = (byte)(buffer[2] >> 2); 335 | setting.Test = (buffer[2] & 1) != 0; 336 | setting.Development = (buffer[2] & 2) != 0; 337 | 338 | _settings.Add(setting); 339 | } 340 | 341 | if (stream.Read(buffer, 0, 2) != 2) 342 | throw new EndOfStreamException(); 343 | 344 | var featureCount = BitConverter.ToUInt16(buffer, 0); 345 | for (var j = 0; j < featureCount; j++) 346 | { 347 | var feature = new FeaturesFeature(); 348 | 349 | if (stream.Read(buffer, 0, 4) != 4) 350 | throw new EndOfStreamException(); 351 | 352 | feature.Hash = BitConverter.ToUInt32(buffer, 0); 353 | feature.Name = _featureNames.ContainsKey(feature.Hash) ? _featureNames[feature.Hash] : "?"; 354 | 355 | feature.Default = this.ReadEncryptedLpString(stream); 356 | feature.Enable = this.ReadEncryptedLpString(stream); 357 | feature.Disable = this.ReadEncryptedLpString(stream); 358 | 359 | // Determine version 360 | // In May 2022 they added two new strings here, which appear 361 | // to represent a start and an end time. Since these strings 362 | // are empty for the first feature, the next four bytes will 363 | // be 0 if we're reading the new format, otherwise they would 364 | // be the next hash. 365 | if (j == 0) 366 | { 367 | if (stream.Read(buffer, 0, 4) != 4) 368 | throw new EndOfStreamException(); 369 | 370 | if (BitConverter.ToUInt32(buffer, 0) == 0) 371 | _formatVersion = 1; 372 | 373 | // Rewind, so we can read the bytes again 374 | stream.Seek(-4, SeekOrigin.Current); 375 | } 376 | 377 | if (_formatVersion > 0) 378 | { 379 | feature.StartTime = this.ReadEncryptedLpString(stream); 380 | feature.EndTime = this.ReadEncryptedLpString(stream); 381 | } 382 | 383 | _features.Add(feature); 384 | } 385 | } 386 | 387 | /// 388 | /// Reads an encrypted, length-prefixed string from the stream 389 | /// and returns it. 390 | /// 391 | /// 392 | /// 393 | /// 394 | /// 395 | private string ReadEncryptedLpString(Stream stream) 396 | { 397 | if (stream.Read(_strBuffer, 0, 2) != 2) 398 | throw new EndOfStreamException(); 399 | 400 | var length = BitConverter.ToUInt16(_strBuffer, 0); 401 | if (length > _strBuffer.Length) 402 | throw new NotSupportedException(); 403 | 404 | if (length <= 0) 405 | return ""; 406 | 407 | if (stream.Read(_strBuffer, 0, length) != length) 408 | throw new EndOfStreamException(); 409 | 410 | for (var i = 0; i < length; i++) 411 | _strBuffer[i] = (byte)(_strBuffer[i] ^ 0x80); 412 | 413 | return Encoding.UTF8.GetString(_strBuffer, 0, length); 414 | } 415 | 416 | /// 417 | /// Saves settings and features in compiled format. 418 | /// 419 | /// 420 | private void SaveAsCompiled(string filePath) 421 | { 422 | using (var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) 423 | this.SaveAsCompiled(fs); 424 | } 425 | 426 | /// 427 | /// Saves settings and features in compiled format. 428 | /// 429 | /// Yiting 430 | /// 431 | private void SaveAsCompiled(Stream stream) 432 | { 433 | stream.Write(BitConverter.GetBytes(_settings.Count), 0, 2); 434 | foreach (var setting in _settings) 435 | { 436 | if (string.IsNullOrEmpty(setting.Name)) 437 | throw new NotSupportedException(); 438 | 439 | if (string.IsNullOrEmpty(setting.Locale)) 440 | throw new NotSupportedException(); 441 | 442 | var nameBuffer = Encoding.UTF8.GetBytes(setting.Name); 443 | for (var num11 = 0; num11 < nameBuffer.Length; num11++) 444 | nameBuffer[num11] = (byte)(nameBuffer[num11] ^ 0x80); 445 | stream.Write(BitConverter.GetBytes(nameBuffer.Length), 0, 2); 446 | stream.Write(nameBuffer, 0, nameBuffer.Length); 447 | 448 | var localeBuffer = Encoding.UTF8.GetBytes(setting.Locale); 449 | for (var num12 = 0; num12 < localeBuffer.Length; num12++) 450 | localeBuffer[num12] = (byte)(localeBuffer[num12] ^ 0x80); 451 | stream.Write(BitConverter.GetBytes(localeBuffer.Length), 0, 2); 452 | stream.Write(localeBuffer, 0, localeBuffer.Length); 453 | 454 | var genBuffer = new byte[] { setting.Generation, setting.Season, (byte)(setting.Subseason << 2) }; 455 | if (setting.Test) 456 | genBuffer[2] = (byte)(genBuffer[2] | 1); 457 | if (setting.Development) 458 | genBuffer[2] = (byte)(genBuffer[2] | 2); 459 | stream.Write(genBuffer, 0, 3); 460 | } 461 | 462 | stream.Write(BitConverter.GetBytes(_features.Count), 0, 2); 463 | foreach (var feature in _features) 464 | { 465 | stream.Write(BitConverter.GetBytes(feature.Hash), 0, 4); 466 | if (string.IsNullOrEmpty(feature.Default)) 467 | { 468 | stream.WriteByte(0); 469 | stream.WriteByte(0); 470 | } 471 | else 472 | { 473 | var defaultBuffer = Encoding.UTF8.GetBytes(feature.Default); 474 | for (var num13 = 0; num13 < defaultBuffer.Length; num13++) 475 | defaultBuffer[num13] = (byte)(defaultBuffer[num13] ^ 0x80); 476 | stream.Write(BitConverter.GetBytes(defaultBuffer.Length), 0, 2); 477 | stream.Write(defaultBuffer, 0, defaultBuffer.Length); 478 | } 479 | 480 | if (string.IsNullOrEmpty(feature.Enable)) 481 | { 482 | stream.WriteByte(0); 483 | stream.WriteByte(0); 484 | } 485 | else 486 | { 487 | var enableBuffer = Encoding.UTF8.GetBytes(feature.Enable); 488 | for (var num14 = 0; num14 < enableBuffer.Length; num14++) 489 | enableBuffer[num14] = (byte)(enableBuffer[num14] ^ 0x80); 490 | stream.Write(BitConverter.GetBytes(enableBuffer.Length), 0, 2); 491 | stream.Write(enableBuffer, 0, enableBuffer.Length); 492 | } 493 | 494 | if (string.IsNullOrEmpty(feature.Disable)) 495 | { 496 | stream.WriteByte(0); 497 | stream.WriteByte(0); 498 | } 499 | else 500 | { 501 | var disableBuffer = Encoding.UTF8.GetBytes(feature.Disable); 502 | for (var num15 = 0; num15 < disableBuffer.Length; num15++) 503 | disableBuffer[num15] = (byte)(disableBuffer[num15] ^ 0x80); 504 | stream.Write(BitConverter.GetBytes(disableBuffer.Length), 0, 2); 505 | stream.Write(disableBuffer, 0, disableBuffer.Length); 506 | } 507 | 508 | if (feature.StartTime != null || feature.EndTime != null) 509 | { 510 | if (string.IsNullOrEmpty(feature.StartTime)) 511 | { 512 | stream.WriteByte(0); 513 | stream.WriteByte(0); 514 | } 515 | else 516 | { 517 | var textBuffer = Encoding.UTF8.GetBytes(feature.StartTime); 518 | for (var num15 = 0; num15 < textBuffer.Length; num15++) 519 | textBuffer[num15] = (byte)(textBuffer[num15] ^ 0x80); 520 | stream.Write(BitConverter.GetBytes(textBuffer.Length), 0, 2); 521 | stream.Write(textBuffer, 0, textBuffer.Length); 522 | } 523 | 524 | if (string.IsNullOrEmpty(feature.EndTime)) 525 | { 526 | stream.WriteByte(0); 527 | stream.WriteByte(0); 528 | } 529 | else 530 | { 531 | var textBuffer = Encoding.UTF8.GetBytes(feature.EndTime); 532 | for (var num15 = 0; num15 < textBuffer.Length; num15++) 533 | textBuffer[num15] = (byte)(textBuffer[num15] ^ 0x80); 534 | stream.Write(BitConverter.GetBytes(textBuffer.Length), 0, 2); 535 | stream.Write(textBuffer, 0, textBuffer.Length); 536 | } 537 | } 538 | } 539 | } 540 | 541 | /// 542 | /// Reads stream and returns features file in XML format. 543 | /// 544 | /// 545 | /// 546 | /// 547 | /// 548 | public static string CompiledToXml(Stream stream) 549 | { 550 | var ff = new FeaturesFile(); 551 | ff.LoadFromCompiled(stream); 552 | return ff.GetXml(); 553 | } 554 | 555 | /// 556 | /// Writes XML to stream in compiled format. 557 | /// 558 | /// 559 | /// 560 | public static void SaveXmlAsCompiled(string xml, Stream compiledStream) 561 | { 562 | var ff = new FeaturesFile(); 563 | using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(xml))) 564 | ff.LoadFromXml(ms); 565 | ff.SaveAsCompiled(compiledStream); 566 | } 567 | } 568 | } 569 | -------------------------------------------------------------------------------- /Fetitor/Fetitor.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {96BC212F-1ED2-4214-8A1C-35543C2B1AC8} 8 | WinExe 9 | Properties 10 | Fetitor 11 | Fetitor 12 | v4.5 13 | 512 14 | 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | false 26 | 27 | 28 | AnyCPU 29 | pdbonly 30 | true 31 | bin\Release\ 32 | TRACE 33 | prompt 34 | 4 35 | false 36 | 37 | 38 | icon.ico 39 | 40 | 41 | 42 | False 43 | ..\Lib\jacobslusser.ScintillaNET.3.2.0-rc\ScintillaNET.dll 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | Form 60 | 61 | 62 | FrmAbout.cs 63 | 64 | 65 | Form 66 | 67 | 68 | FrmMain.cs 69 | 70 | 71 | Form 72 | 73 | 74 | FrmSearch.cs 75 | 76 | 77 | Form 78 | 79 | 80 | FrmUpdateFeatureNames.cs 81 | 82 | 83 | Component 84 | 85 | 86 | 87 | 88 | 89 | FrmAbout.cs 90 | 91 | 92 | FrmMain.cs 93 | 94 | 95 | FrmSearch.cs 96 | 97 | 98 | FrmUpdateFeatureNames.cs 99 | 100 | 101 | ResXFileCodeGenerator 102 | Resources.Designer.cs 103 | Designer 104 | 105 | 106 | True 107 | Resources.resx 108 | True 109 | 110 | 111 | 112 | SettingsSingleFileGenerator 113 | Settings.Designer.cs 114 | 115 | 116 | True 117 | Settings.settings 118 | True 119 | 120 | 121 | 122 | 123 | PreserveNewest 124 | 125 | 126 | 127 | 128 | 135 | -------------------------------------------------------------------------------- /Fetitor/FrmAbout.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace Fetitor 2 | { 3 | partial class FrmAbout 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.components = new System.ComponentModel.Container(); 32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmAbout)); 33 | this.PnlHeader = new System.Windows.Forms.Panel(); 34 | this.LblVersion = new System.Windows.Forms.Label(); 35 | this.ImgIcon = new System.Windows.Forms.PictureBox(); 36 | this.LblName = new System.Windows.Forms.Label(); 37 | this.BtnOK = new System.Windows.Forms.Button(); 38 | this.ImgGitHub = new System.Windows.Forms.PictureBox(); 39 | this.ImgPatreon = new System.Windows.Forms.PictureBox(); 40 | this.GrpScintilla = new System.Windows.Forms.GroupBox(); 41 | this.textBox2 = new System.Windows.Forms.TextBox(); 42 | this.GrpLicense = new System.Windows.Forms.GroupBox(); 43 | this.textBox1 = new System.Windows.Forms.TextBox(); 44 | this.ToolTip = new System.Windows.Forms.ToolTip(this.components); 45 | this.PnlHeader.SuspendLayout(); 46 | ((System.ComponentModel.ISupportInitialize)(this.ImgIcon)).BeginInit(); 47 | ((System.ComponentModel.ISupportInitialize)(this.ImgGitHub)).BeginInit(); 48 | ((System.ComponentModel.ISupportInitialize)(this.ImgPatreon)).BeginInit(); 49 | this.GrpScintilla.SuspendLayout(); 50 | this.GrpLicense.SuspendLayout(); 51 | this.SuspendLayout(); 52 | // 53 | // PnlHeader 54 | // 55 | this.PnlHeader.BackColor = System.Drawing.Color.White; 56 | this.PnlHeader.Controls.Add(this.LblVersion); 57 | this.PnlHeader.Controls.Add(this.ImgIcon); 58 | this.PnlHeader.Controls.Add(this.LblName); 59 | this.PnlHeader.Dock = System.Windows.Forms.DockStyle.Top; 60 | this.PnlHeader.Location = new System.Drawing.Point(0, 0); 61 | this.PnlHeader.Name = "PnlHeader"; 62 | this.PnlHeader.Size = new System.Drawing.Size(483, 58); 63 | this.PnlHeader.TabIndex = 18; 64 | // 65 | // LblVersion 66 | // 67 | this.LblVersion.AutoSize = true; 68 | this.LblVersion.ForeColor = System.Drawing.Color.Gray; 69 | this.LblVersion.Location = new System.Drawing.Point(136, 28); 70 | this.LblVersion.Name = "LblVersion"; 71 | this.LblVersion.Size = new System.Drawing.Size(37, 13); 72 | this.LblVersion.TabIndex = 17; 73 | this.LblVersion.Text = "v1.2.7"; 74 | // 75 | // ImgIcon 76 | // 77 | this.ImgIcon.Image = ((System.Drawing.Image)(resources.GetObject("ImgIcon.Image"))); 78 | this.ImgIcon.Location = new System.Drawing.Point(12, 12); 79 | this.ImgIcon.Name = "ImgIcon"; 80 | this.ImgIcon.Size = new System.Drawing.Size(32, 32); 81 | this.ImgIcon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; 82 | this.ImgIcon.TabIndex = 16; 83 | this.ImgIcon.TabStop = false; 84 | // 85 | // LblName 86 | // 87 | this.LblName.AutoSize = true; 88 | this.LblName.Font = new System.Drawing.Font("Microsoft Sans Serif", 20.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 89 | this.LblName.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); 90 | this.LblName.Location = new System.Drawing.Point(50, 13); 91 | this.LblName.Name = "LblName"; 92 | this.LblName.Size = new System.Drawing.Size(92, 31); 93 | this.LblName.TabIndex = 15; 94 | this.LblName.Text = "Fetitor"; 95 | // 96 | // BtnOK 97 | // 98 | this.BtnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 99 | this.BtnOK.Location = new System.Drawing.Point(398, 518); 100 | this.BtnOK.Name = "BtnOK"; 101 | this.BtnOK.Size = new System.Drawing.Size(75, 23); 102 | this.BtnOK.TabIndex = 1; 103 | this.BtnOK.Text = "OK"; 104 | this.BtnOK.UseVisualStyleBackColor = true; 105 | this.BtnOK.Click += new System.EventHandler(this.BtnOK_Click); 106 | // 107 | // ImgGitHub 108 | // 109 | this.ImgGitHub.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 110 | this.ImgGitHub.Cursor = System.Windows.Forms.Cursors.Hand; 111 | this.ImgGitHub.Image = ((System.Drawing.Image)(resources.GetObject("ImgGitHub.Image"))); 112 | this.ImgGitHub.Location = new System.Drawing.Point(207, 509); 113 | this.ImgGitHub.Name = "ImgGitHub"; 114 | this.ImgGitHub.Size = new System.Drawing.Size(32, 32); 115 | this.ImgGitHub.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; 116 | this.ImgGitHub.TabIndex = 19; 117 | this.ImgGitHub.TabStop = false; 118 | this.ImgGitHub.Tag = "https://github.com/exectails"; 119 | this.ToolTip.SetToolTip(this.ImgGitHub, "https://github.com/exectails"); 120 | this.ImgGitHub.Click += new System.EventHandler(this.LinkImage_Click); 121 | // 122 | // ImgPatreon 123 | // 124 | this.ImgPatreon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 125 | this.ImgPatreon.Cursor = System.Windows.Forms.Cursors.Hand; 126 | this.ImgPatreon.Image = ((System.Drawing.Image)(resources.GetObject("ImgPatreon.Image"))); 127 | this.ImgPatreon.Location = new System.Drawing.Point(12, 509); 128 | this.ImgPatreon.Name = "ImgPatreon"; 129 | this.ImgPatreon.Size = new System.Drawing.Size(189, 32); 130 | this.ImgPatreon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; 131 | this.ImgPatreon.TabIndex = 20; 132 | this.ImgPatreon.TabStop = false; 133 | this.ImgPatreon.Tag = "https://www.patreon.com/exectails"; 134 | this.ToolTip.SetToolTip(this.ImgPatreon, "https://www.patreon.com/exectails"); 135 | this.ImgPatreon.Click += new System.EventHandler(this.LinkImage_Click); 136 | // 137 | // GrpScintilla 138 | // 139 | this.GrpScintilla.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 140 | | System.Windows.Forms.AnchorStyles.Right))); 141 | this.GrpScintilla.BackColor = System.Drawing.SystemColors.Control; 142 | this.GrpScintilla.Controls.Add(this.textBox2); 143 | this.GrpScintilla.Location = new System.Drawing.Point(14, 229); 144 | this.GrpScintilla.Name = "GrpScintilla"; 145 | this.GrpScintilla.Size = new System.Drawing.Size(459, 272); 146 | this.GrpScintilla.TabIndex = 22; 147 | this.GrpScintilla.TabStop = false; 148 | this.GrpScintilla.Text = "ScintillaNET License"; 149 | // 150 | // textBox2 151 | // 152 | this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 153 | | System.Windows.Forms.AnchorStyles.Left) 154 | | System.Windows.Forms.AnchorStyles.Right))); 155 | this.textBox2.BackColor = System.Drawing.SystemColors.Control; 156 | this.textBox2.BorderStyle = System.Windows.Forms.BorderStyle.None; 157 | this.textBox2.Location = new System.Drawing.Point(8, 19); 158 | this.textBox2.Multiline = true; 159 | this.textBox2.Name = "textBox2"; 160 | this.textBox2.ReadOnly = true; 161 | this.textBox2.Size = new System.Drawing.Size(443, 247); 162 | this.textBox2.TabIndex = 3; 163 | this.textBox2.TabStop = false; 164 | this.textBox2.Text = resources.GetString("textBox2.Text"); 165 | // 166 | // GrpLicense 167 | // 168 | this.GrpLicense.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 169 | | System.Windows.Forms.AnchorStyles.Right))); 170 | this.GrpLicense.BackColor = System.Drawing.SystemColors.Control; 171 | this.GrpLicense.Controls.Add(this.textBox1); 172 | this.GrpLicense.Location = new System.Drawing.Point(12, 64); 173 | this.GrpLicense.Name = "GrpLicense"; 174 | this.GrpLicense.Size = new System.Drawing.Size(459, 159); 175 | this.GrpLicense.TabIndex = 21; 176 | this.GrpLicense.TabStop = false; 177 | this.GrpLicense.Text = "License"; 178 | // 179 | // textBox1 180 | // 181 | this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 182 | | System.Windows.Forms.AnchorStyles.Right))); 183 | this.textBox1.BackColor = System.Drawing.SystemColors.Control; 184 | this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.None; 185 | this.textBox1.Location = new System.Drawing.Point(8, 19); 186 | this.textBox1.Multiline = true; 187 | this.textBox1.Name = "textBox1"; 188 | this.textBox1.ReadOnly = true; 189 | this.textBox1.Size = new System.Drawing.Size(443, 134); 190 | this.textBox1.TabIndex = 3; 191 | this.textBox1.TabStop = false; 192 | this.textBox1.Text = resources.GetString("textBox1.Text"); 193 | // 194 | // FrmAbout 195 | // 196 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 197 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 198 | this.ClientSize = new System.Drawing.Size(483, 553); 199 | this.Controls.Add(this.GrpScintilla); 200 | this.Controls.Add(this.GrpLicense); 201 | this.Controls.Add(this.ImgPatreon); 202 | this.Controls.Add(this.ImgGitHub); 203 | this.Controls.Add(this.BtnOK); 204 | this.Controls.Add(this.PnlHeader); 205 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 206 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 207 | this.MaximizeBox = false; 208 | this.MinimizeBox = false; 209 | this.Name = "FrmAbout"; 210 | this.ShowInTaskbar = false; 211 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 212 | this.Text = "About"; 213 | this.PnlHeader.ResumeLayout(false); 214 | this.PnlHeader.PerformLayout(); 215 | ((System.ComponentModel.ISupportInitialize)(this.ImgIcon)).EndInit(); 216 | ((System.ComponentModel.ISupportInitialize)(this.ImgGitHub)).EndInit(); 217 | ((System.ComponentModel.ISupportInitialize)(this.ImgPatreon)).EndInit(); 218 | this.GrpScintilla.ResumeLayout(false); 219 | this.GrpScintilla.PerformLayout(); 220 | this.GrpLicense.ResumeLayout(false); 221 | this.GrpLicense.PerformLayout(); 222 | this.ResumeLayout(false); 223 | this.PerformLayout(); 224 | 225 | } 226 | 227 | #endregion 228 | private System.Windows.Forms.Panel PnlHeader; 229 | private System.Windows.Forms.Label LblVersion; 230 | private System.Windows.Forms.PictureBox ImgIcon; 231 | private System.Windows.Forms.Label LblName; 232 | private System.Windows.Forms.Button BtnOK; 233 | private System.Windows.Forms.PictureBox ImgGitHub; 234 | private System.Windows.Forms.PictureBox ImgPatreon; 235 | private System.Windows.Forms.GroupBox GrpScintilla; 236 | private System.Windows.Forms.TextBox textBox2; 237 | private System.Windows.Forms.GroupBox GrpLicense; 238 | private System.Windows.Forms.TextBox textBox1; 239 | private System.Windows.Forms.ToolTip ToolTip; 240 | } 241 | } -------------------------------------------------------------------------------- /Fetitor/FrmAbout.cs: -------------------------------------------------------------------------------- 1 | // This program is free software: you can redistribute it and/or modify 2 | // it under the terms of the GNU General Public License as published by 3 | // the Free Software Foundation, either version 3 of the License, or 4 | // (at your option) any later version. 5 | // 6 | // This program is distributed in the hope that it will be useful, 7 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 8 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 | // GNU General Public License for more details. 10 | // 11 | // You should have received a copy of the GNU General Public License 12 | // along with this program. If not, see . 13 | 14 | using System; 15 | using System.Diagnostics; 16 | using System.Windows.Forms; 17 | 18 | namespace Fetitor 19 | { 20 | /// 21 | /// Form with information about the program. 22 | /// 23 | public partial class FrmAbout : Form 24 | { 25 | /// 26 | /// Creates new instance. 27 | /// 28 | public FrmAbout() 29 | { 30 | InitializeComponent(); 31 | } 32 | 33 | /// 34 | /// Closes form. 35 | /// 36 | /// 37 | /// 38 | private void BtnOK_Click(object sender, EventArgs e) 39 | { 40 | this.Close(); 41 | } 42 | 43 | /// 44 | /// Opens the clicked image's link in its Tag. 45 | /// 46 | /// 47 | /// 48 | private void LinkImage_Click(object sender, EventArgs e) 49 | { 50 | var tag = ((sender as Control)?.Tag as string); 51 | if (tag != null) 52 | Process.Start(tag); 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Fetitor/FrmAbout.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | 123 | iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m 124 | dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALaSURBVFhHxZXdT1JhHMedN1257rvzrper7rrqX/Au 125 | /4Fcs9VsuUqFqfMFIxAhJAYxGPEWgTFs1CyEUGO9MovsonUtI+dUBoqKfuP32OEc4HhuPDue7cP3+f5+ 126 | z/Z8d3ie57QAOFVEi0oiWlQS0aKSiBaVhP0EAoHOKlCYzloAv9+PTCaDlZUVxbBYLNWl/wfw+XxYWFg4 127 | Eda4HpdmzjAlvzj/COloC1Py2elpVNrbmZKfrmotgNfrRSqVOhHXZq/iQu4cU/JLsSso4DxT8n87OoDe 128 | XqbkzWYzH8Dj8SCRSJyIcPw5Hs89ZEo+GQ/g/VsNkvMvmf8QCmF5aoop+boAbrcbVqtVUUZGRvgALpeL 129 | jKzPj99/JJmqvo3qcxTA6XTi8PBQVi7rs5LUBXA4HDg4OGBEo1GGcMx5sVrjmJQCXOyLSTI5OckHsNvt 130 | qFQqskEhvv78JYlOp+MD2Gw27O3tMSKRSB1cTdgXzhPWOU8hPn3P4r5KDc+LUBPUqwtAu7JcLsvG/v4+ 131 | 0pllSbRaLR+ArsXt7W1GOByuIfSN/ePmku7u7mLxyzfcfdAHp8/fBPUmJib4AHQpFItF2aC3kPz4WRKN 132 | RsMHMJlMKBQKjGAwyBCOOS9WaxyT7uzsIL6URk/vPdhc7iaoNzY2xgcwGo3Y2tqSDfob5lKLkoyOjvIB 133 | DAYDNjY2GI3fba4m7AvnCeucL5VKiCWSuNlzB2b70yaoV3cV6/V6rK+vywbtg9l3cUmGh4f5AHQm19bW 134 | GPRp5hD6xv5xc0lpH0TezOHGrdswWJ40Qb2hoSE+AJ3JfD4vG7QPwrHXkgwODvIB6EzmcjkGfZo55RD2 135 | Gvticzc3NxGcfYXr3d3QGk1NUE+tVh8FqD6tdCZXV1dlgzaiPxKVRKVS0eqtFKBtfHy8tpvlgI6hdyYi 136 | ycDAAAVoYwG6urqe9ff3Q0loTS4AvQYanFUYWrOVbcLTRLSoHGj5B6CLWU5mGaLGAAAAAElFTkSuQmCC 137 | 138 | 139 | 140 | 141 | iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m 142 | dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAK3SURBVFhHxZa7TxRhFMXxkWABAQzg2kDsbHmYaEI0 143 | ofB/ICFofAQ7CjQxFvwBNJQUBiobJBI7Y+mjsUMKCjEatTFqI0ZIxDieM55vudz5dpmdmcST/BL23nPP 144 | HSb7zU5bXp3q6+8F18EDsAF+gETwb9bYo6dXY+WFsCGwAvZAWHgY9HJmSDGtC8Nd4D74A2JL8sBZZnQp 145 | Np8wwP/6HYiFFoFZ+e4GjOPguwarhJnjWhMXDCMyxgKqgNkjWndQaPSA9zIGNsEjUOSiOMNZZtg6d/Ro 146 | 7b5QXDamwKR67YDH67Pq4dg9E/ZY0kNvu2YnVbcss1cXCqPOEBiWJRU+82ScBUdVqos19Q584/F5GMSy 147 | R2VJTWuuGTgnS2Exw2UG1oKhBn6bhuVKaiohZrjMAHfWaJg2RcsncFI5hcUM8FGZnmka+MiMNa8po7SY 148 | 5bIDK2z6Y0J4e1p7fDYRs5Tp92yyueOK5INmKxMz3Q6yw4Yvki3NVSZkvnU7UhpdwLbmKhMz3Y6Uhg3Q 149 | r9nSYpbLDmyzue6KgSnNlxazXHZgnc0lVwy8BseVUVjMUFZsxxINE65oWVBOYTHDZVomaOgEP03Rswpq 150 | ysstzJzWbCyTcGdnMC+axjy4BJ6b2i/wENwE/OU8lg4aocZbfQHcAvxx40yYj7Go0XR4AOyqwRfJWcB3 151 | gFeqWRh+RKN1sQYey3MY3DWg0X9CYc4YyHlwBvgfkjGNZITeRedtxJxG9oUib+FLY3qqejfgG849cBlk 152 | bn8Qen3ALorBHfHThQbfDewjc0atXIKfF2uXeZjd/AsNwyDY0gB5Ae6Aq+AuOCFrRug1uwBmDsraXDDy 153 | JeKJBj3dsmXEnvMGmNXayw0G+K2+Ab4AG9bKBXwFPLqZU5NbGO4APJZvwDeQvm7HxJ489N4GHWo1VpIk 154 | /5Gk7S8Lp6cBadxETwAAAABJRU5ErkJggg== 155 | 156 | 157 | 158 | 17, 17 159 | 160 | 161 | 162 | iVBORw0KGgoAAAANSUhEUgAAAL0AAAAgCAIAAADITe76AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m 163 | dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAATLSURBVHhe7ZjPix1FEMe9ePCPEf+OePAUAoon2UMM 164 | Gg+6oBgM8SJB2ausgoj4AwkKQQIe4sWDFz2EEBGDQRCJp3VFza7z5r1Zv93fmpp6PT3zZhp5h7WK76Gn 165 | f9RUV3265+0+VJ0/63LNlXPjKpFz4yqRc+MqkXPjKpFz4yqRc+MqkXPjKtEkbh557Az02uNPJP3V5YvL 166 | r240939pjh6s7n5ff/pe9fxT6RzXadQkbh5+9Az06jo3yxvXmuXyZN2aw4PFm5fsNNepVAk3i/23BJMB 167 | a/74vXrhaV3uOn0q4QYfJgFk2OrPPtDlQ1rduSWzW2vu/7rYu8LRk+Mj6TW2/PqmLkdbek9OVt9+U+3u 168 | 6BDa6JExjN67W3/4DofQkN7jI52PCexbfnk9PPYCgyE2nW+la+v9vWQoaHeHo9b4Fgqr2Ak/7MGL2JMY 169 | IrdbVrPeIDxq6uDKjtJzyFXbw51qcqZrPjeXL8aQNtjq3o/WQ1b58hwecHSMm92dfnJ1YRg9PJBeY/Xn 170 | H2O048ZUWt81l5vF6y/K8Ho9OuW4gTEYyPINb+iZyw1M4VCIrWlg6lk3vj1uFm9f5bvHrXnwt/WQVRp0 171 | W29eOawlOmXUiOlDjpjogEKcbKuOHOnVJbXBBbO7I9yY+XLiex6mZBPzMVOqZS6wTi03uhEJ/s4tPvK9 172 | 9KDlp1hmGwbXyuFhDwOI3tiGQ4Uy9ET/dKLcoMEJ03eaaDY39btyr45bU/1jPWSVBk1uYnXxyA1ruq0s 173 | XhRSGU6VWWhHIRYGCcXr0GAG0RmGIlXsYeWmZ5ORgDypcVuwTqPcYH5ox88oGvAmq6LE5xRu4o2Shc9O 174 | oEPmZ+5OE82/b66+Et69yZrf8r8GrBh0Ypp6bi+xQAMrkT3cCG/vSnaU6UPGWSG8Whhl7Y+PpCQmm4kl 175 | 9YB4UbHYUp72N0qnoe9ULJXSjLYiqGuHuOkbVzFjyYGRIOMFQ4cMNewdvwK3xk317Lnmrz/Di0dtefML 176 | 6yGrbHmwH359mIXE/kNueM3oiS/ghh6wMDwiKpYtBt+pxw34ICjy2yjWD48MgBcDNYUbzFdQJIBN3GAC 177 | Iw9J2B43COX6J3jZiDX1orp0QZcPqR80e1ghZoE5TdRPEJZgLSdn0yc1aL9TmExi9Aj2udmYTb4osRSv 178 | lpv+RjCTQ2tmiB/ihqSyDQqV1Px3yuCo3CAYXm/cwpa4qZ57cvVzCHHI6mvv69oRZbgxJ5hbynIjx2X6 179 | 7+LYE0rS/i5Gjxz3aGhLSSZzQ+z6xs9Wp2FupHI9420UJoxyAzEPmCaj7QdIPSiadNJxsx7/+E6zKuIG 180 | eumZ1U8/yGuNNU2D26ibNiopZ8+4MaKQGJaEtbm/tEPBWJuBv8PJhHITAogHlJXuc5Pa+rcvc7jbT5X9 181 | jRI6o0lsrfj5SHwyBnjm40ZudKcdSTGqxCRp69zoI2yL3EAXztUf7ev/APFtWt3+bvHGy2tzRpUpjzkr 182 | Y9xAyX/22j+mdJQppiGbmhrLDY9jWDuTG72rtAYUy0aHogFuGHy3nSiBKd5/eNzMTbudMK2FFVvQY4OG 183 | JTvhBg1O2y43rv+xnBtXiZwbV4mcG1eJJnHjciVyblwlcm5cJXJuXCVyblwlcm5cJXJuXPN1/uy/l2dF 184 | s02cwusAAAAASUVORK5CYII= 185 | 186 | 187 | 188 | Copyright (c) 2015, Jacob Slusser, https://github.com/jacobslusser 189 | 190 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 191 | 192 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 193 | 194 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 195 | 196 | 197 | This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. 198 | 199 | This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 200 | 201 | You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. 202 | 203 | 204 | 205 | AAABAAIAICAAAAEAIACoEAAAJgAAABAQAAABACAAaAQAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAA 206 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 207 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 208 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 209 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 210 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAANAAAADwAAAA8AAAAPAAAADwAA 211 | AA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAA 212 | AA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA0AAAACAAAADWVlZaJ5eXn/eXl5/3l5 213 | ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5 214 | ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/ZWVlogAAAA0AAAANhYWF/+/v 215 | 7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v 216 | 7//v7+//7+/v/+/v7//29vb/r62k/6+tpP+vraT/r62k/6+tpP+vraT/r62k/6+tpP96enr/AAAADQAA 217 | AAKGhob/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm 218 | 5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+/v7/+xr6b/sa+m/7Gvpv+xr6b/sa+m/7Gvpv+xr6b/sa+m/3t7 219 | e/8AAAACAAAAAIeHh//n5+f/5+fn/6Ghof/n5+f/oaGh/6Ghof+hoaH/5+fn/+fn5/+hoaH/oaGh/+fn 220 | 5/+hoaH/oaGh/+fn5/+hoaH/oaGh/6Ghof/n5+f/8PDw/7Oyqf9paWT/kZCJ/5GQif+RkIn/kZCJ/5GQ 221 | if+zsqn/fHx8/wAAAAAAAAAAiYmJ/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np 222 | 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/x8fH/trWs/7a1rP+2taz/trWs/7a1 223 | rP+2taz/trWs/7a1rP9+fn7/AAAAAAAAAACLi4v/6+vr/+vr6/+kpKT/pKSk/6SkpP/r6+v/pKSk/6Sk 224 | pP/r6+v/6+vr/6SkpP+kpKT/6+vr/6SkpP+kpKT/pKSk/+vr6/+kpKT/6+vr//Ly8v+5t6//bWxn/5aV 225 | jv+WlY7/lpWO/5aVjv+WlY7/ubev/39/f/8AAAAAAAAAAIyMjP/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t 226 | 7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/9PT0/7y7 227 | sv+8u7L/vLuy/7y7sv+8u7L/vLuy/7y7sv+8u7L/gICA/wAAAAAAAAAAjo6O/+/v7//v7+//p6en/6en 228 | p/+np6f/p6en/+/v7/+np6f/7+/v/+/v7/+np6f/7+/v/6enp/+np6f/7+/v/+/v7/+np6f/p6en/+/v 229 | 7//19fX/v761/3Bvav+bmpP/m5qT/5uak/+bmpP/m5qT/7++tf+CgoL/AAAAAAAAAACQkJD/8fHx//Hx 230 | 8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx 231 | 8f/x8fH/8fHx//b29v/Dwbn/w8G5/8PBuf/Dwbn/w8G5/8PBuf/Dwbn/w8G5/4ODg/8AAAAAAAAAAJGR 232 | kf/y8vL/8vLy/6mpqf+pqan/8vLy/6mpqf+pqan/qamp//Ly8v/y8vL/qamp/6mpqf+pqan/8vLy/6mp 233 | qf+pqan/8vLy/6mpqf/y8vL/9/f3/8bEvP91c2//oZ+Z/6Gfmf+hn5n/oZ+Z/6Gfmf/GxLz/hISE/wAA 234 | AAAAAAAAk5OT//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 235 | 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/4+Pj/ysi//8rIv//KyL//ysi//8rIv//KyL//ysi//8rI 236 | v/+Ghob/AAAAAAAAAACVlZX/9vb2//b29v+srKz/rKys/6ysrP/29vb/rKys/6ysrP/29vb/9vb2/6ys 237 | rP+srKz/9vb2/6ysrP+srKz/rKys//b29v+srKz/9vb2//n5+f/Ny8P/eHdy/6alnv+mpZ7/pqWe/6al 238 | nv+mpZ7/zcvD/4eHh/8AAAAAAAAAAJeXl//4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4 239 | +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+/v7/9DOxv/Qzsb/0M7G/9DO 240 | xv/Qzsb/0M7G/9DOxv/Qzsb/iYmJ/wAAAAAAAAAAmZmZ//r6+v/6+vr/r6+v/6+vr/+vr6//r6+v//r6 241 | +v+vr6//+vr6//r6+v+vr6//+vr6/6+vr/+vr6//+vr6//r6+v+vr6//r6+v//r6+v/8/Pz/09HJ/3x7 242 | dv+rqqP/q6qj/6uqo/+rqqP/q6qj/9PRyf+Li4v/AAAAAAAAAACampr//Pz8//z8/P/8/Pz//Pz8//z8 243 | /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//39 244 | /f/W1Mz/1tTM/9bUzP/W1Mz/1tTM/9bUzP/W1Mz/1tTM/4uLi/8AAAAAAAAAAJycnP/9/f3//f39/7Gx 245 | sf+xsbH//f39/7Gxsf+xsbH/sbGx//39/f/9/f3/sbGx/7Gxsf+xsbH//f39/7Gxsf+xsbH//f39/7Gx 246 | sf/9/f3//v7+/7V4Kv+1eCr/tXgq/7V4Kv+1eCr/tXgq/7V4Kv+1eCr/jY2N/wAAAAAAAAAAnp6e//7+ 247 | /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ 248 | /v/+/v7//v7+//7+/v/+/v7/04wx/9OMMf/TjDH/04wx/9OMMf/TjDH/04wx/9OMMf+Pj4//AAAAAAAA 249 | AACfn5////////////////////////////////////////////////////////////////////////// 250 | ///////////////////////////////////c2tL/3NrS/9za0v/c2tL/3NrS/9za0v/c2tL/3NrS/4+P 251 | j/8AAAAAAAAAAKGhof+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eX 252 | l/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eX 253 | l/+Xl5f/goKC/wAAAAAAAAAAo6Oj/76+vv++vr7/vr6+/76+vv++vr7/vr6+/76+vv++vr7/vr6+/76+ 254 | vv++vr7/vr6+/76+vv++vr7/vr6+/76+vv+ovKz/iLmS/6i8rP++vr7/p7y//4a6wP+uvb//vr6+/6ur 255 | xf+Pj9D/q6vF/76+vv+Tk5P/AAAAAAAAAACkpKT/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HB 256 | wf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/z6yVv8a5yn/PrJW/8HBwf84tcT/KP/y/zi1 257 | xP/BwcH/T0/q/3Nz//9PT+r/wcHB/5OTk/8AAAAAAAAAAKWlpf/CwsL/wsLC/8LCwv/CwsL/wsLC/8LC 258 | wv/CwsL/wsLC/8LCwv/CwsL/wsLC/8LCwv/CwsL/wsLC/8LCwv/CwsL/jLyX/wetK/+MvJf/wsLC/4q9 259 | w/8Ascb/ir3D/8LCwv+UlNP/ISH8/5SU0//CwsL/lJSU/wAAAAAAAAAApqam/87Ozv/V1dX/1dXV/9XV 260 | 1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV 261 | 1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f+VlZX/AAAAAAAAAACnp6dXp6en/6en 262 | p/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6en 263 | p/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp1cAAAAAAAAAAAAA 264 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 265 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 266 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 267 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 268 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 269 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 270 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 271 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 272 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 273 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 274 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////AAAAAAAAAAAAAAAAAAAAAIAA 275 | AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA 276 | AAGAAAABgAAAAYAAAAGAAAABgAAAAf//////////////////////////KAAAABAAAAAgAAAAAQAgAAAA 277 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 278 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGRkwPDw8hzw8PIc8PDyHPDw8hzw8PIc8PDyHPDw8hzw8 279 | PIc8PDyHPDw8hzw8PIc8PDyHPDw8hzw8PIcZGRkwQkJCg+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq 280 | 6v/q6ur/6urq/+7u7v+wrqX/sK6l/7Cupf+wrqX/PT09g4iIiIDo6Oj/1tbW/8XFxf/W1tb/1tbW/9bW 281 | 1v/FxcX/1tbW/8XFxf/s7Oz/oqGZ/6Oimv+jopr/rKui/319fYCLi4uA7Ozs/8jIyP/a2tr/yMjI/+zs 282 | 7P/IyMj/2tra/8jIyP/a2tr/7+/v/6emnv+pqKD/qaig/7GwqP9/f3+Aj4+PgPDw8P/MzMz/zMzM/97e 283 | 3v/w8PD/3t7e/8zMzP/w8PD/zMzM//Ly8v+tq6T/r62m/6+tpv+4tq7/goKCgJKSkoDz8/P/zs7O/+Dg 284 | 4P/Ozs7/8/Pz/87Ozv/g4OD/zs7O/+Dg4P/19fX/s7Gq/7WzrP+1s6z/vry0/4WFhYCWlpaA9/f3/9LS 285 | 0v/k5OT/0tLS//f39//S0tL/5OTk/9LS0v/k5OT/+Pj4/7m3sP+7ubL/u7my/8TDu/+IiIiAmZmZgPv7 286 | +//V1dX/1dXV/+jo6P/7+/v/6Ojo/9XV1f/7+/v/1dXV//v7+/++vbX/wL+3/8C/t//KyMH/i4uLgJ2d 287 | nYD9/f3/19fX/+rq6v/X19f//f39/9fX1//q6ur/19fX/+rq6v/9/f3/xIIt/8SCLf/Egi3/xIIt/46O 288 | joCgoKCAy8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/7m4tP+5uLT/ubi0/7m4 289 | tP+IiIiAo6OjgL+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//YsNv/5m7oP9jys3/mbzA/39/ 290 | 3/+ensv/k5OTgKWlpYDJycn/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/4/Em/++ysD/jcbM/73K 291 | y/+Xl97/wMDP/5SUlICnp6cWp6engKenp4Cnp6eAp6engKenp4Cnp6eAp6engKenp4Cnp6eAp6engKen 292 | p4Cnp6eAp6engKenp4Cnp6cWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 293 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 294 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//6xBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA 295 | rEEAAKxBAACsQQAArEEAAKxBAACsQf//rEH//6xB 296 | 297 | 298 | -------------------------------------------------------------------------------- /Fetitor/FrmMain.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace Fetitor 2 | { 3 | partial class FrmMain 4 | { 5 | /// 6 | /// Erforderliche Designervariable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Verwendete Ressourcen bereinigen. 12 | /// 13 | /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Vom Windows Form-Designer generierter Code 24 | 25 | /// 26 | /// Erforderliche Methode für die Designerunterstützung. 27 | /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.components = new System.ComponentModel.Container(); 32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain)); 33 | this.MainMenu = new System.Windows.Forms.MainMenu(this.components); 34 | this.menuItem1 = new System.Windows.Forms.MenuItem(); 35 | this.MnuOpen = new System.Windows.Forms.MenuItem(); 36 | this.MnuSave = new System.Windows.Forms.MenuItem(); 37 | this.MnuSaveAsXml = new System.Windows.Forms.MenuItem(); 38 | this.menuItem5 = new System.Windows.Forms.MenuItem(); 39 | this.MnuExit = new System.Windows.Forms.MenuItem(); 40 | this.menuItem3 = new System.Windows.Forms.MenuItem(); 41 | this.MnuUndo = new System.Windows.Forms.MenuItem(); 42 | this.MnuRedo = new System.Windows.Forms.MenuItem(); 43 | this.menuItem9 = new System.Windows.Forms.MenuItem(); 44 | this.MnuSearch = new System.Windows.Forms.MenuItem(); 45 | this.MnuUpdateFeatures = new System.Windows.Forms.MenuItem(); 46 | this.menuItem2 = new System.Windows.Forms.MenuItem(); 47 | this.MnuAbout = new System.Windows.Forms.MenuItem(); 48 | this.OpenFileDialog = new System.Windows.Forms.OpenFileDialog(); 49 | this.SaveFileDialog = new System.Windows.Forms.SaveFileDialog(); 50 | this.StatusStrip = new System.Windows.Forms.StatusStrip(); 51 | this.LblCurLine = new System.Windows.Forms.ToolStripStatusLabel(); 52 | this.LblCurCol = new System.Windows.Forms.ToolStripStatusLabel(); 53 | this.LblKnownFeatureCount = new System.Windows.Forms.ToolStripStatusLabel(); 54 | this.ToolStrip = new System.Windows.Forms.ToolStrip(); 55 | this.BtnOpen = new System.Windows.Forms.ToolStripButton(); 56 | this.BtnSave = new System.Windows.Forms.ToolStripButton(); 57 | this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); 58 | this.BtnUndo = new System.Windows.Forms.ToolStripButton(); 59 | this.BtnRedo = new System.Windows.Forms.ToolStripButton(); 60 | this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); 61 | this.BtnSearch = new System.Windows.Forms.ToolStripButton(); 62 | this.BtnUpdateFeatureNames = new System.Windows.Forms.ToolStripButton(); 63 | this.SplMain = new System.Windows.Forms.SplitContainer(); 64 | this.TxtEditor = new Fetitor.MyScintilla(); 65 | this.BtnClearFilter = new System.Windows.Forms.Button(); 66 | this.LstFeatures = new System.Windows.Forms.ListView(); 67 | this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); 68 | this.TxtFeatureFilter = new System.Windows.Forms.TextBox(); 69 | this.MnuEnableSelected = new System.Windows.Forms.MenuItem(); 70 | this.menuItem6 = new System.Windows.Forms.MenuItem(); 71 | this.StatusStrip.SuspendLayout(); 72 | this.ToolStrip.SuspendLayout(); 73 | ((System.ComponentModel.ISupportInitialize)(this.SplMain)).BeginInit(); 74 | this.SplMain.Panel1.SuspendLayout(); 75 | this.SplMain.Panel2.SuspendLayout(); 76 | this.SplMain.SuspendLayout(); 77 | this.SuspendLayout(); 78 | // 79 | // MainMenu 80 | // 81 | this.MainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { 82 | this.menuItem1, 83 | this.menuItem3, 84 | this.menuItem2}); 85 | // 86 | // menuItem1 87 | // 88 | this.menuItem1.Index = 0; 89 | this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { 90 | this.MnuOpen, 91 | this.MnuSave, 92 | this.MnuSaveAsXml, 93 | this.menuItem5, 94 | this.MnuExit}); 95 | this.menuItem1.Text = "File"; 96 | // 97 | // MnuOpen 98 | // 99 | this.MnuOpen.Index = 0; 100 | this.MnuOpen.Shortcut = System.Windows.Forms.Shortcut.CtrlO; 101 | this.MnuOpen.Text = "Open..."; 102 | this.MnuOpen.Click += new System.EventHandler(this.BtnOpen_Click); 103 | // 104 | // MnuSave 105 | // 106 | this.MnuSave.Enabled = false; 107 | this.MnuSave.Index = 1; 108 | this.MnuSave.Shortcut = System.Windows.Forms.Shortcut.CtrlS; 109 | this.MnuSave.Text = "Save"; 110 | this.MnuSave.Click += new System.EventHandler(this.BtnSave_Click); 111 | // 112 | // MnuSaveAsXml 113 | // 114 | this.MnuSaveAsXml.Enabled = false; 115 | this.MnuSaveAsXml.Index = 2; 116 | this.MnuSaveAsXml.Text = "Save as XML..."; 117 | this.MnuSaveAsXml.Click += new System.EventHandler(this.MenuSaveAsXml_Click); 118 | // 119 | // menuItem5 120 | // 121 | this.menuItem5.Index = 3; 122 | this.menuItem5.Text = "-"; 123 | // 124 | // MnuExit 125 | // 126 | this.MnuExit.Index = 4; 127 | this.MnuExit.Text = "Exit"; 128 | this.MnuExit.Click += new System.EventHandler(this.MenuExit_Click); 129 | // 130 | // menuItem3 131 | // 132 | this.menuItem3.Index = 1; 133 | this.menuItem3.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { 134 | this.MnuUndo, 135 | this.MnuRedo, 136 | this.menuItem9, 137 | this.MnuSearch, 138 | this.MnuUpdateFeatures, 139 | this.menuItem6, 140 | this.MnuEnableSelected}); 141 | this.menuItem3.Text = "Edit"; 142 | // 143 | // MnuUndo 144 | // 145 | this.MnuUndo.Index = 0; 146 | this.MnuUndo.Shortcut = System.Windows.Forms.Shortcut.CtrlZ; 147 | this.MnuUndo.Text = "Undo"; 148 | this.MnuUndo.Click += new System.EventHandler(this.BtnUndo_Click); 149 | // 150 | // MnuRedo 151 | // 152 | this.MnuRedo.Index = 1; 153 | this.MnuRedo.Shortcut = System.Windows.Forms.Shortcut.CtrlY; 154 | this.MnuRedo.Text = "Redo"; 155 | this.MnuRedo.Click += new System.EventHandler(this.BtnRedo_Click); 156 | // 157 | // menuItem9 158 | // 159 | this.menuItem9.Index = 2; 160 | this.menuItem9.Text = "-"; 161 | // 162 | // MnuSearch 163 | // 164 | this.MnuSearch.Index = 3; 165 | this.MnuSearch.Shortcut = System.Windows.Forms.Shortcut.CtrlF; 166 | this.MnuSearch.Text = "Search"; 167 | this.MnuSearch.Click += new System.EventHandler(this.BtnSearch_Click); 168 | // 169 | // MnuUpdateFeatures 170 | // 171 | this.MnuUpdateFeatures.Index = 4; 172 | this.MnuUpdateFeatures.Text = "Update Feature Names"; 173 | this.MnuUpdateFeatures.Click += new System.EventHandler(this.BtnUpdateFeatureNames_Click); 174 | // 175 | // menuItem2 176 | // 177 | this.menuItem2.Index = 2; 178 | this.menuItem2.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { 179 | this.MnuAbout}); 180 | this.menuItem2.Text = "?"; 181 | // 182 | // MnuAbout 183 | // 184 | this.MnuAbout.Index = 0; 185 | this.MnuAbout.Text = "About"; 186 | this.MnuAbout.Click += new System.EventHandler(this.MenuAbout_Click); 187 | // 188 | // OpenFileDialog 189 | // 190 | this.OpenFileDialog.Filter = "Compiled XML file|*.xml.compiled"; 191 | // 192 | // SaveFileDialog 193 | // 194 | this.SaveFileDialog.Filter = "XML file|*.xml"; 195 | // 196 | // StatusStrip 197 | // 198 | this.StatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 199 | this.LblCurLine, 200 | this.LblCurCol, 201 | this.LblKnownFeatureCount}); 202 | this.StatusStrip.Location = new System.Drawing.Point(0, 556); 203 | this.StatusStrip.Name = "StatusStrip"; 204 | this.StatusStrip.Size = new System.Drawing.Size(1008, 24); 205 | this.StatusStrip.TabIndex = 3; 206 | this.StatusStrip.Text = "statusStrip1"; 207 | // 208 | // LblCurLine 209 | // 210 | this.LblCurLine.AutoSize = false; 211 | this.LblCurLine.Name = "LblCurLine"; 212 | this.LblCurLine.Padding = new System.Windows.Forms.Padding(0, 0, 25, 0); 213 | this.LblCurLine.Size = new System.Drawing.Size(60, 19); 214 | this.LblCurLine.Text = "Line 0"; 215 | this.LblCurLine.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 216 | // 217 | // LblCurCol 218 | // 219 | this.LblCurCol.AutoSize = false; 220 | this.LblCurCol.Name = "LblCurCol"; 221 | this.LblCurCol.Padding = new System.Windows.Forms.Padding(0, 0, 25, 0); 222 | this.LblCurCol.Size = new System.Drawing.Size(60, 19); 223 | this.LblCurCol.Text = "Col 0"; 224 | this.LblCurCol.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 225 | // 226 | // LblKnownFeatureCount 227 | // 228 | this.LblKnownFeatureCount.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Left; 229 | this.LblKnownFeatureCount.Name = "LblKnownFeatureCount"; 230 | this.LblKnownFeatureCount.Size = new System.Drawing.Size(126, 19); 231 | this.LblKnownFeatureCount.Text = "Known Feature Count"; 232 | // 233 | // ToolStrip 234 | // 235 | this.ToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; 236 | this.ToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 237 | this.BtnOpen, 238 | this.BtnSave, 239 | this.toolStripSeparator1, 240 | this.BtnUndo, 241 | this.BtnRedo, 242 | this.toolStripSeparator2, 243 | this.BtnSearch, 244 | this.BtnUpdateFeatureNames}); 245 | this.ToolStrip.Location = new System.Drawing.Point(0, 0); 246 | this.ToolStrip.Name = "ToolStrip"; 247 | this.ToolStrip.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; 248 | this.ToolStrip.Size = new System.Drawing.Size(1008, 25); 249 | this.ToolStrip.TabIndex = 2; 250 | this.ToolStrip.Text = "toolStrip1"; 251 | // 252 | // BtnOpen 253 | // 254 | this.BtnOpen.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; 255 | this.BtnOpen.Image = ((System.Drawing.Image)(resources.GetObject("BtnOpen.Image"))); 256 | this.BtnOpen.ImageTransparentColor = System.Drawing.Color.Magenta; 257 | this.BtnOpen.Name = "BtnOpen"; 258 | this.BtnOpen.Size = new System.Drawing.Size(23, 22); 259 | this.BtnOpen.Text = "Open..."; 260 | this.BtnOpen.Click += new System.EventHandler(this.BtnOpen_Click); 261 | // 262 | // BtnSave 263 | // 264 | this.BtnSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; 265 | this.BtnSave.Enabled = false; 266 | this.BtnSave.Image = ((System.Drawing.Image)(resources.GetObject("BtnSave.Image"))); 267 | this.BtnSave.ImageTransparentColor = System.Drawing.Color.Magenta; 268 | this.BtnSave.Name = "BtnSave"; 269 | this.BtnSave.Size = new System.Drawing.Size(23, 22); 270 | this.BtnSave.Text = "Save"; 271 | this.BtnSave.Click += new System.EventHandler(this.BtnSave_Click); 272 | // 273 | // toolStripSeparator1 274 | // 275 | this.toolStripSeparator1.Name = "toolStripSeparator1"; 276 | this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); 277 | // 278 | // BtnUndo 279 | // 280 | this.BtnUndo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; 281 | this.BtnUndo.Enabled = false; 282 | this.BtnUndo.Image = ((System.Drawing.Image)(resources.GetObject("BtnUndo.Image"))); 283 | this.BtnUndo.ImageTransparentColor = System.Drawing.Color.Magenta; 284 | this.BtnUndo.Name = "BtnUndo"; 285 | this.BtnUndo.Size = new System.Drawing.Size(23, 22); 286 | this.BtnUndo.Text = "Undo"; 287 | this.BtnUndo.Click += new System.EventHandler(this.BtnUndo_Click); 288 | // 289 | // BtnRedo 290 | // 291 | this.BtnRedo.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; 292 | this.BtnRedo.Enabled = false; 293 | this.BtnRedo.Image = ((System.Drawing.Image)(resources.GetObject("BtnRedo.Image"))); 294 | this.BtnRedo.ImageTransparentColor = System.Drawing.Color.Magenta; 295 | this.BtnRedo.Name = "BtnRedo"; 296 | this.BtnRedo.Size = new System.Drawing.Size(23, 22); 297 | this.BtnRedo.Text = "Redo"; 298 | this.BtnRedo.Click += new System.EventHandler(this.BtnRedo_Click); 299 | // 300 | // toolStripSeparator2 301 | // 302 | this.toolStripSeparator2.Name = "toolStripSeparator2"; 303 | this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); 304 | // 305 | // BtnSearch 306 | // 307 | this.BtnSearch.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; 308 | this.BtnSearch.Image = ((System.Drawing.Image)(resources.GetObject("BtnSearch.Image"))); 309 | this.BtnSearch.ImageTransparentColor = System.Drawing.Color.Magenta; 310 | this.BtnSearch.Name = "BtnSearch"; 311 | this.BtnSearch.Size = new System.Drawing.Size(23, 22); 312 | this.BtnSearch.Text = "Search"; 313 | this.BtnSearch.Click += new System.EventHandler(this.BtnSearch_Click); 314 | // 315 | // BtnUpdateFeatureNames 316 | // 317 | this.BtnUpdateFeatureNames.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; 318 | this.BtnUpdateFeatureNames.Image = ((System.Drawing.Image)(resources.GetObject("BtnUpdateFeatureNames.Image"))); 319 | this.BtnUpdateFeatureNames.ImageTransparentColor = System.Drawing.Color.Magenta; 320 | this.BtnUpdateFeatureNames.Name = "BtnUpdateFeatureNames"; 321 | this.BtnUpdateFeatureNames.Size = new System.Drawing.Size(23, 22); 322 | this.BtnUpdateFeatureNames.Text = "Update Feature Names"; 323 | this.BtnUpdateFeatureNames.Click += new System.EventHandler(this.BtnUpdateFeatureNames_Click); 324 | // 325 | // SplMain 326 | // 327 | this.SplMain.Dock = System.Windows.Forms.DockStyle.Fill; 328 | this.SplMain.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; 329 | this.SplMain.IsSplitterFixed = true; 330 | this.SplMain.Location = new System.Drawing.Point(0, 25); 331 | this.SplMain.Name = "SplMain"; 332 | // 333 | // SplMain.Panel1 334 | // 335 | this.SplMain.Panel1.Controls.Add(this.TxtEditor); 336 | // 337 | // SplMain.Panel2 338 | // 339 | this.SplMain.Panel2.Controls.Add(this.BtnClearFilter); 340 | this.SplMain.Panel2.Controls.Add(this.LstFeatures); 341 | this.SplMain.Panel2.Controls.Add(this.TxtFeatureFilter); 342 | this.SplMain.Size = new System.Drawing.Size(1008, 531); 343 | this.SplMain.SplitterDistance = 730; 344 | this.SplMain.TabIndex = 4; 345 | // 346 | // TxtEditor 347 | // 348 | this.TxtEditor.AllowDrop = true; 349 | this.TxtEditor.BorderStyle = System.Windows.Forms.BorderStyle.None; 350 | this.TxtEditor.CaretLineBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(235)))), ((int)(((byte)(235))))); 351 | this.TxtEditor.CaretLineVisible = true; 352 | this.TxtEditor.Dock = System.Windows.Forms.DockStyle.Fill; 353 | this.TxtEditor.HighlightGuide = 0; 354 | this.TxtEditor.IndentationGuides = ScintillaNET.IndentView.Real; 355 | this.TxtEditor.Location = new System.Drawing.Point(0, 0); 356 | this.TxtEditor.Name = "TxtEditor"; 357 | this.TxtEditor.RectangularSelectionAnchor = 0; 358 | this.TxtEditor.RectangularSelectionAnchorVirtualSpace = 0; 359 | this.TxtEditor.RectangularSelectionCaret = 0; 360 | this.TxtEditor.RectangularSelectionCaretVirtualSpace = 0; 361 | this.TxtEditor.ScrollWidth = 100; 362 | this.TxtEditor.Size = new System.Drawing.Size(730, 531); 363 | this.TxtEditor.TabIndex = 1; 364 | // 365 | // BtnClearFilter 366 | // 367 | this.BtnClearFilter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 368 | this.BtnClearFilter.Font = new System.Drawing.Font("Microsoft Sans Serif", 5.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 369 | this.BtnClearFilter.Location = new System.Drawing.Point(255, 513); 370 | this.BtnClearFilter.Name = "BtnClearFilter"; 371 | this.BtnClearFilter.Size = new System.Drawing.Size(18, 18); 372 | this.BtnClearFilter.TabIndex = 4; 373 | this.BtnClearFilter.Text = "X"; 374 | this.BtnClearFilter.UseVisualStyleBackColor = true; 375 | this.BtnClearFilter.Click += new System.EventHandler(this.BtnClearFilter_Click); 376 | // 377 | // LstFeatures 378 | // 379 | this.LstFeatures.BorderStyle = System.Windows.Forms.BorderStyle.None; 380 | this.LstFeatures.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { 381 | this.columnHeader1}); 382 | this.LstFeatures.Dock = System.Windows.Forms.DockStyle.Fill; 383 | this.LstFeatures.FullRowSelect = true; 384 | this.LstFeatures.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None; 385 | this.LstFeatures.HideSelection = false; 386 | this.LstFeatures.Location = new System.Drawing.Point(0, 0); 387 | this.LstFeatures.Name = "LstFeatures"; 388 | this.LstFeatures.Size = new System.Drawing.Size(274, 511); 389 | this.LstFeatures.TabIndex = 2; 390 | this.LstFeatures.UseCompatibleStateImageBehavior = false; 391 | this.LstFeatures.View = System.Windows.Forms.View.Details; 392 | this.LstFeatures.DoubleClick += new System.EventHandler(this.LstFeatures_DoubleClick); 393 | // 394 | // columnHeader1 395 | // 396 | this.columnHeader1.Text = "Name"; 397 | this.columnHeader1.Width = 100; 398 | // 399 | // TxtFeatureFilter 400 | // 401 | this.TxtFeatureFilter.Dock = System.Windows.Forms.DockStyle.Bottom; 402 | this.TxtFeatureFilter.ForeColor = System.Drawing.Color.Silver; 403 | this.TxtFeatureFilter.Location = new System.Drawing.Point(0, 511); 404 | this.TxtFeatureFilter.Name = "TxtFeatureFilter"; 405 | this.TxtFeatureFilter.Size = new System.Drawing.Size(274, 20); 406 | this.TxtFeatureFilter.TabIndex = 3; 407 | this.TxtFeatureFilter.Text = "Filter"; 408 | this.TxtFeatureFilter.Enter += new System.EventHandler(this.TxtFeatureFilter_Enter); 409 | this.TxtFeatureFilter.KeyUp += new System.Windows.Forms.KeyEventHandler(this.TxtFeatureFilter_KeyUp); 410 | this.TxtFeatureFilter.Leave += new System.EventHandler(this.TxtFeatureFilter_Leave); 411 | // 412 | // MnuEnableSelected 413 | // 414 | this.MnuEnableSelected.Index = 6; 415 | this.MnuEnableSelected.Shortcut = System.Windows.Forms.Shortcut.CtrlE; 416 | this.MnuEnableSelected.Text = "Enable Current Line\'s Feature"; 417 | this.MnuEnableSelected.Click += new System.EventHandler(this.MnuEnableSelected_Click); 418 | // 419 | // menuItem6 420 | // 421 | this.menuItem6.Index = 5; 422 | this.menuItem6.Text = "-"; 423 | // 424 | // FrmMain 425 | // 426 | this.AllowDrop = true; 427 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 428 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 429 | this.ClientSize = new System.Drawing.Size(1008, 580); 430 | this.Controls.Add(this.SplMain); 431 | this.Controls.Add(this.ToolStrip); 432 | this.Controls.Add(this.StatusStrip); 433 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 434 | this.Menu = this.MainMenu; 435 | this.MinimumSize = new System.Drawing.Size(520, 240); 436 | this.Name = "FrmMain"; 437 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 438 | this.Text = "Fetitor"; 439 | this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMain_FormClosing); 440 | this.Load += new System.EventHandler(this.FrmMain_Load); 441 | this.DragDrop += new System.Windows.Forms.DragEventHandler(this.FrmMain_DragDrop); 442 | this.DragEnter += new System.Windows.Forms.DragEventHandler(this.FrmMain_DragEnter); 443 | this.StatusStrip.ResumeLayout(false); 444 | this.StatusStrip.PerformLayout(); 445 | this.ToolStrip.ResumeLayout(false); 446 | this.ToolStrip.PerformLayout(); 447 | this.SplMain.Panel1.ResumeLayout(false); 448 | this.SplMain.Panel2.ResumeLayout(false); 449 | this.SplMain.Panel2.PerformLayout(); 450 | ((System.ComponentModel.ISupportInitialize)(this.SplMain)).EndInit(); 451 | this.SplMain.ResumeLayout(false); 452 | this.ResumeLayout(false); 453 | this.PerformLayout(); 454 | 455 | } 456 | 457 | #endregion 458 | 459 | private System.Windows.Forms.ToolStrip ToolStrip; 460 | private System.Windows.Forms.ToolStripButton BtnOpen; 461 | private System.Windows.Forms.MainMenu MainMenu; 462 | private System.Windows.Forms.MenuItem menuItem1; 463 | private System.Windows.Forms.ToolStripButton BtnSave; 464 | private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; 465 | private System.Windows.Forms.ToolStripButton BtnUndo; 466 | private System.Windows.Forms.ToolStripButton BtnRedo; 467 | private System.Windows.Forms.MenuItem MnuOpen; 468 | private System.Windows.Forms.MenuItem MnuSave; 469 | private System.Windows.Forms.MenuItem menuItem5; 470 | private System.Windows.Forms.MenuItem MnuExit; 471 | private System.Windows.Forms.MenuItem menuItem2; 472 | private System.Windows.Forms.MenuItem MnuAbout; 473 | private System.Windows.Forms.OpenFileDialog OpenFileDialog; 474 | private System.Windows.Forms.SaveFileDialog SaveFileDialog; 475 | private System.Windows.Forms.StatusStrip StatusStrip; 476 | private System.Windows.Forms.ToolStripStatusLabel LblKnownFeatureCount; 477 | private System.Windows.Forms.SplitContainer SplMain; 478 | private MyScintilla TxtEditor; 479 | private System.Windows.Forms.MenuItem MnuSaveAsXml; 480 | private System.Windows.Forms.ListView LstFeatures; 481 | private System.Windows.Forms.ColumnHeader columnHeader1; 482 | private System.Windows.Forms.TextBox TxtFeatureFilter; 483 | private System.Windows.Forms.ToolStripStatusLabel LblCurCol; 484 | private System.Windows.Forms.ToolStripStatusLabel LblCurLine; 485 | private System.Windows.Forms.Button BtnClearFilter; 486 | private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; 487 | private System.Windows.Forms.ToolStripButton BtnSearch; 488 | private System.Windows.Forms.ToolStripButton BtnUpdateFeatureNames; 489 | private System.Windows.Forms.MenuItem menuItem3; 490 | private System.Windows.Forms.MenuItem MnuUndo; 491 | private System.Windows.Forms.MenuItem MnuRedo; 492 | private System.Windows.Forms.MenuItem menuItem9; 493 | private System.Windows.Forms.MenuItem MnuSearch; 494 | private System.Windows.Forms.MenuItem MnuUpdateFeatures; 495 | private System.Windows.Forms.MenuItem menuItem6; 496 | private System.Windows.Forms.MenuItem MnuEnableSelected; 497 | } 498 | } 499 | 500 | -------------------------------------------------------------------------------- /Fetitor/FrmMain.cs: -------------------------------------------------------------------------------- 1 | // This program is free software: you can redistribute it and/or modify 2 | // it under the terms of the GNU General Public License as published by 3 | // the Free Software Foundation, either version 3 of the License, or 4 | // (at your option) any later version. 5 | // 6 | // This program is distributed in the hope that it will be useful, 7 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 8 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 | // GNU General Public License for more details. 10 | // 11 | // You should have received a copy of the GNU General Public License 12 | // along with this program. If not, see . 13 | 14 | using Fetitor.Properties; 15 | using ScintillaNET; 16 | using System; 17 | using System.Collections.Generic; 18 | using System.Drawing; 19 | using System.IO; 20 | using System.Linq; 21 | using System.Text.RegularExpressions; 22 | using System.Windows.Forms; 23 | using System.Xml; 24 | 25 | namespace Fetitor 26 | { 27 | public partial class FrmMain : Form 28 | { 29 | private readonly string _windowTitle; 30 | private string _openedFilePath; 31 | private bool _fileChanged; 32 | private List _features = new List(); 33 | private FrmSearch _searchForm; 34 | 35 | /// 36 | /// Creates new instance. 37 | /// 38 | public FrmMain() 39 | { 40 | this.InitializeComponent(); 41 | this.SetUpEditor(); 42 | this.UpdateFeatureNames(); 43 | 44 | _windowTitle = this.Text; 45 | this.LblKnownFeatureCount.Text = ""; 46 | this.ToolStrip.Renderer = new ToolStripRendererNL(); 47 | 48 | this.UpdateSaveButtons(); 49 | } 50 | 51 | /// 52 | /// Updates feature names list. 53 | /// 54 | private void UpdateFeatureNames() 55 | { 56 | var featuresPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "features.txt"); 57 | if (File.Exists(featuresPath)) 58 | FeaturesFile.LoadFeatureNames(featuresPath); 59 | } 60 | 61 | /// 62 | /// Called when the form loads. 63 | /// 64 | /// 65 | /// 66 | private void FrmMain_Load(object sender, EventArgs e) 67 | { 68 | var args = Environment.GetCommandLineArgs(); 69 | if (args.Length > 1) 70 | { 71 | var filePath = args[1]; 72 | this.OpenFile(filePath); 73 | } 74 | 75 | if (Settings.Default.WindowMaximized) 76 | { 77 | this.WindowState = FormWindowState.Maximized; 78 | } 79 | else if (Settings.Default.WindowLocation.X != -1 || Settings.Default.WindowLocation.Y != -1) 80 | { 81 | this.WindowState = FormWindowState.Normal; 82 | this.Location = Settings.Default.WindowLocation; 83 | this.Size = Settings.Default.WindowSize; 84 | } 85 | } 86 | 87 | /// 88 | /// Saves settings when the form is closing. 89 | /// 90 | /// 91 | /// 92 | private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) 93 | { 94 | Settings.Default.WindowMaximized = (this.WindowState == FormWindowState.Maximized); 95 | if (this.WindowState == FormWindowState.Normal) 96 | { 97 | Settings.Default.WindowLocation = this.Location; 98 | Settings.Default.WindowSize = this.Size; 99 | } 100 | 101 | Settings.Default.Save(); 102 | } 103 | 104 | /// 105 | /// Sets up the editor for XML code and subscribes to its events. 106 | /// 107 | public void SetUpEditor() 108 | { 109 | this.TxtEditor.Styles[Style.Default].Font = "Courier New"; 110 | this.TxtEditor.Styles[Style.Default].Size = 10; 111 | this.TxtEditor.Styles[Style.Xml.XmlStart].ForeColor = Color.Blue; 112 | this.TxtEditor.Styles[Style.Xml.XmlEnd].ForeColor = Color.Blue; 113 | this.TxtEditor.Styles[Style.Xml.TagEnd].ForeColor = Color.Blue; 114 | this.TxtEditor.Styles[Style.Xml.Tag].ForeColor = Color.Blue; 115 | this.TxtEditor.Styles[Style.Xml.TagEnd].ForeColor = Color.Blue; 116 | this.TxtEditor.Styles[Style.Xml.Attribute].ForeColor = Color.Red; 117 | this.TxtEditor.Styles[Style.Xml.DoubleString].ForeColor = Color.Blue; 118 | this.TxtEditor.Styles[Style.Xml.SingleString].ForeColor = Color.Blue; 119 | this.TxtEditor.Styles[Style.IndentGuide].ForeColor = Color.LightGray; 120 | this.TxtEditor.Margins[0].Width = 40; 121 | this.TxtEditor.Lexer = Lexer.Xml; 122 | this.TxtEditor.TextChanged += this.TxtEditor_OnTextChanged; 123 | this.TxtEditor.CtrlS += this.TxtEditor_OnCtrlS; 124 | this.TxtEditor.CtrlF += this.TxtEditor_OnCtrlF; 125 | this.TxtEditor.UpdateUI += this.TxtEditor_OnUpdateUI; 126 | } 127 | 128 | /// 129 | /// Called if Ctrl+F is pressed in the editor. 130 | /// 131 | /// 132 | /// 133 | private void TxtEditor_OnCtrlF(object sender, EventArgs e) 134 | { 135 | this.BtnSearch_Click(null, null); 136 | } 137 | 138 | /// 139 | /// Called if the editor's text or styling have changed. 140 | /// 141 | /// 142 | /// 143 | private void TxtEditor_OnUpdateUI(object sender, UpdateUIEventArgs e) 144 | { 145 | if ((e.Change & UpdateChange.Selection) != 0 || (e.Change & UpdateChange.Content) != 0) 146 | { 147 | var pos = this.TxtEditor.CurrentPosition; 148 | var line = this.TxtEditor.LineFromPosition(pos); 149 | var col = (pos - this.TxtEditor.Lines[line].Position); 150 | 151 | this.LblCurLine.Text = "Line " + (line + 1); 152 | this.LblCurCol.Text = "Col " + (col + 1); 153 | } 154 | } 155 | 156 | /// 157 | /// Called when text in the editor changes. 158 | /// 159 | /// 160 | /// 161 | private void TxtEditor_OnTextChanged(object sender, EventArgs e) 162 | { 163 | _fileChanged = true; 164 | 165 | this.UpdateUndo(); 166 | this.UpdateSaveButtons(); 167 | } 168 | 169 | /// 170 | /// Called when Ctrl+S is pressed in the editor. 171 | /// 172 | /// 173 | /// 174 | private void TxtEditor_OnCtrlS(object sender, EventArgs e) 175 | { 176 | if (this.BtnSave.Enabled) 177 | this.BtnSave.PerformClick(); 178 | } 179 | 180 | /// 181 | /// Updated Undo and Redo buttons, based on the editor's state. 182 | /// 183 | private void UpdateUndo() 184 | { 185 | this.BtnUndo.Enabled = this.TxtEditor.CanUndo; 186 | this.BtnRedo.Enabled = this.TxtEditor.CanRedo; 187 | } 188 | 189 | /// 190 | /// Resets Undo and Redo in the editor and updates the buttons. 191 | /// 192 | private void ResetUndo() 193 | { 194 | this.TxtEditor.EmptyUndoBuffer(); 195 | this.UpdateUndo(); 196 | } 197 | 198 | /// 199 | /// Toggles save buttons, based on whether saving is possible right 200 | /// now. 201 | /// 202 | private void UpdateSaveButtons() 203 | { 204 | var enabled = (_fileChanged && !string.IsNullOrWhiteSpace(_openedFilePath)); 205 | this.MnuSave.Enabled = this.BtnSave.Enabled = enabled; 206 | 207 | var fileOpen = (_openedFilePath != null); 208 | this.MnuSaveAsXml.Enabled = fileOpen; 209 | } 210 | 211 | /// 212 | /// Updates feature name jump list. 213 | /// 214 | private void UpdateFeatureList() 215 | { 216 | var text = this.TxtEditor.Text; 217 | 218 | var index = text.IndexOf(""); 219 | if (index == -1) 220 | return; 221 | 222 | var list = new List(); 223 | 224 | while ((index = text.IndexOf("Name=", index)) != -1) 225 | { 226 | var nameStartIndex = index + "Name=\"".Length; 227 | var nameEndIndex = text.IndexOf("\"", nameStartIndex); 228 | var length = nameEndIndex - nameStartIndex; 229 | 230 | index = nameEndIndex; 231 | 232 | var name = text.Substring(nameStartIndex, length); 233 | if (name == "?") 234 | continue; 235 | 236 | var lvi = new ListViewItem(name); 237 | lvi.Tag = new Tuple(nameStartIndex, nameEndIndex); 238 | 239 | list.Add(lvi); 240 | } 241 | 242 | _features = list; 243 | 244 | this.PopulateFeatureList(_features); 245 | } 246 | 247 | /// 248 | /// Called when feature list is double clicked. 249 | /// 250 | /// 251 | /// 252 | private void LstFeatures_DoubleClick(object sender, EventArgs e) 253 | { 254 | if (this.LstFeatures.SelectedItems.Count == 0) 255 | return; 256 | 257 | var selectedItem = this.LstFeatures.SelectedItems[0]; 258 | if (selectedItem == null || selectedItem.Tag == null) 259 | return; 260 | 261 | if (!(selectedItem.Tag is Tuple indices)) 262 | return; 263 | 264 | this.TxtEditor.SetSelection(indices.Item1, indices.Item2); 265 | this.TxtEditor.ScrollRange(indices.Item1, indices.Item2); 266 | this.TxtEditor.Focus(); 267 | } 268 | 269 | /// 270 | /// Called when one of the Open buttons is clicked. 271 | /// 272 | /// 273 | /// 274 | private void BtnOpen_Click(object sender, EventArgs e) 275 | { 276 | var result = this.OpenFileDialog.ShowDialog(); 277 | if (result != DialogResult.OK) 278 | return; 279 | 280 | this.OpenFile(OpenFileDialog.FileName); 281 | } 282 | 283 | /// 284 | /// Called if the Undo button is clicked. 285 | /// 286 | /// 287 | /// 288 | private void BtnUndo_Click(object sender, EventArgs e) 289 | { 290 | this.TxtEditor.Undo(); 291 | 292 | this.UpdateUndo(); 293 | this.UpdateSaveButtons(); 294 | } 295 | 296 | /// 297 | /// Called if the Redo button is clicked. 298 | /// 299 | /// 300 | /// 301 | private void BtnRedo_Click(object sender, EventArgs e) 302 | { 303 | this.TxtEditor.Redo(); 304 | 305 | this.UpdateUndo(); 306 | this.UpdateSaveButtons(); 307 | } 308 | 309 | /// 310 | /// Called if the Exit menu item is clicked. 311 | /// 312 | /// 313 | /// 314 | private void MenuExit_Click(object sender, EventArgs e) 315 | { 316 | this.Close(); 317 | } 318 | 319 | /// 320 | /// Called if a file is dragged onto the form. 321 | /// 322 | /// 323 | /// 324 | private void FrmMain_DragEnter(object sender, DragEventArgs e) 325 | { 326 | if (e.Data.GetDataPresent(DataFormats.FileDrop)) 327 | e.Effect = DragDropEffects.Copy; 328 | } 329 | 330 | /// 331 | /// Called if a file is dropped on the form. 332 | /// 333 | /// 334 | /// 335 | private void FrmMain_DragDrop(object sender, DragEventArgs e) 336 | { 337 | var files = (string[])e.Data.GetData(DataFormats.FileDrop); 338 | if (files.Length == 0) 339 | return; 340 | 341 | this.OpenFile(files[0]); 342 | } 343 | 344 | /// 345 | /// Tries to open compiled XML file at the given path in the editor. 346 | /// 347 | /// 348 | private void OpenFile(string filePath) 349 | { 350 | // Check file's existence 351 | if (!File.Exists(filePath)) 352 | { 353 | MessageBox.Show("File not found: " + filePath, _windowTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 354 | return; 355 | } 356 | 357 | // Check file extension 358 | if (!Path.GetFileName(filePath).EndsWith(".xml.compiled")) 359 | { 360 | MessageBox.Show("Unknown file type, expected: *.xml.compiled", _windowTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 361 | return; 362 | } 363 | 364 | // Read file 365 | try 366 | { 367 | string xml; 368 | using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 369 | xml = FeaturesFile.CompiledToXml(fs); 370 | 371 | this.TxtEditor.Text = xml; 372 | this.Text = _windowTitle + " - " + filePath; 373 | 374 | _openedFilePath = filePath; 375 | 376 | var known = Regex.Matches(xml, @"Name=""[^\?\""]+""").Count; 377 | var total = Regex.Matches(xml, @"Name=""").Count; 378 | this.LblKnownFeatureCount.Text = string.Format("Known features: {0}/{1}", known, total); 379 | 380 | _fileChanged = false; 381 | this.ResetUndo(); 382 | this.UpdateSaveButtons(); 383 | this.UpdateFeatureList(); 384 | } 385 | catch (InvalidDataException) 386 | { 387 | MessageBox.Show("Invalid file format.", _windowTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 388 | } 389 | catch (EndOfStreamException) 390 | { 391 | MessageBox.Show("Corrupted file.", _windowTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 392 | } 393 | catch (NotSupportedException) 394 | { 395 | MessageBox.Show("Unsupported file.", _windowTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 396 | } 397 | catch (Exception ex) 398 | { 399 | MessageBox.Show("Error: " + ex.Message, _windowTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 400 | } 401 | } 402 | 403 | /// 404 | /// Called if one of the Save buttons is clicked. 405 | /// 406 | /// 407 | /// 408 | private void BtnSave_Click(object sender, EventArgs e) 409 | { 410 | if (string.IsNullOrWhiteSpace(_openedFilePath)) 411 | return; 412 | 413 | try 414 | { 415 | this.SaveFile(_openedFilePath); 416 | 417 | _fileChanged = false; 418 | this.UpdateSaveButtons(); 419 | } 420 | catch (XmlException ex) 421 | { 422 | MessageBox.Show("XML Error: " + ex.Message, _windowTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 423 | } 424 | catch (Exception ex) 425 | { 426 | MessageBox.Show("Error: " + ex.ToString(), _windowTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 427 | } 428 | } 429 | 430 | /// 431 | /// Saves file to given path. 432 | /// 433 | /// 434 | private void SaveFile(string filePath) 435 | { 436 | using (var fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) 437 | FeaturesFile.SaveXmlAsCompiled(TxtEditor.Text, fs); 438 | } 439 | 440 | /// 441 | /// Called if the Save as XML menu item is clicked. 442 | /// 443 | /// 444 | /// 445 | private void MenuSaveAsXml_Click(object sender, EventArgs e) 446 | { 447 | this.SaveFileDialog.InitialDirectory = Path.GetDirectoryName(_openedFilePath); 448 | this.SaveFileDialog.FileName = "features.xml"; 449 | 450 | if (this.SaveFileDialog.ShowDialog() != DialogResult.OK) 451 | return; 452 | 453 | try 454 | { 455 | using (var fs = this.SaveFileDialog.OpenFile()) 456 | using (var sw = new StreamWriter(fs)) 457 | sw.Write(this.TxtEditor.Text); 458 | } 459 | catch (Exception ex) 460 | { 461 | MessageBox.Show("Error: " + ex.ToString(), _windowTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 462 | } 463 | } 464 | 465 | /// 466 | /// Called if the About menu item is clicked. 467 | /// 468 | /// 469 | /// 470 | private void MenuAbout_Click(object sender, EventArgs e) 471 | { 472 | var form = new FrmAbout(); 473 | form.ShowDialog(); 474 | } 475 | 476 | /// 477 | /// Called if TxtFeatureFilter gets the focus. 478 | /// 479 | /// 480 | /// 481 | private void TxtFeatureFilter_Enter(object sender, EventArgs e) 482 | { 483 | if (this.TxtFeatureFilter.ForeColor == Color.Silver) 484 | { 485 | this.TxtFeatureFilter.ForeColor = Color.Black; 486 | this.TxtFeatureFilter.Text = ""; 487 | } 488 | } 489 | 490 | /// 491 | /// Called if TxtFeatureFilter loses the focus. 492 | /// 493 | /// 494 | /// 495 | private void TxtFeatureFilter_Leave(object sender, EventArgs e) 496 | { 497 | if (string.IsNullOrWhiteSpace(this.TxtFeatureFilter.Text.Trim())) 498 | { 499 | this.TxtFeatureFilter.ForeColor = Color.Silver; 500 | this.TxtFeatureFilter.Text = "Filter"; 501 | this.FilterFeatures(""); 502 | } 503 | } 504 | 505 | /// 506 | /// Filters the feature list, only showing those that contain 507 | /// the given string. 508 | /// 509 | /// 510 | private void FilterFeatures(string filter) 511 | { 512 | this.PopulateFeatureList(_features.Where(a => a.Text.ToUpper().Contains(filter.ToUpper()))); 513 | } 514 | 515 | /// 516 | /// Fills feature list with the given items. 517 | /// 518 | /// 519 | private void PopulateFeatureList(IEnumerable items) 520 | { 521 | this.LstFeatures.BeginUpdate(); 522 | this.LstFeatures.Items.Clear(); 523 | 524 | // Add names alphabetically 525 | foreach (var item in items.OrderBy(a => a.Text)) 526 | this.LstFeatures.Items.Add(item); 527 | 528 | // Autosize column header 529 | this.LstFeatures.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize); 530 | this.LstFeatures.Columns[0].Width -= 5; 531 | 532 | this.LstFeatures.EndUpdate(); 533 | } 534 | 535 | /// 536 | /// Called if a key is let go of in TxtFeatureFilter. 537 | /// 538 | /// 539 | /// 540 | private void TxtFeatureFilter_KeyUp(object sender, KeyEventArgs e) 541 | { 542 | var filter = this.TxtFeatureFilter.Text; 543 | this.FilterFeatures(filter); 544 | } 545 | 546 | /// 547 | /// Called when Clear Filter button is clicked. 548 | /// 549 | /// 550 | /// 551 | private void BtnClearFilter_Click(object sender, EventArgs e) 552 | { 553 | if (!string.IsNullOrWhiteSpace(this.TxtFeatureFilter.Text.Trim())) 554 | { 555 | this.TxtFeatureFilter.Text = ""; 556 | this.TxtFeatureFilter_Leave(null, null); 557 | } 558 | } 559 | 560 | /// 561 | /// Jumps to the next occurance of given text in editor. 562 | /// 563 | /// Text to search for, starting at current position. 564 | /// True if text was found, False if not. 565 | public bool SearchFor(string searchText) 566 | { 567 | var text = this.TxtEditor.Text; 568 | var currentPos = this.TxtEditor.CurrentPosition; 569 | var selectLength = searchText.Length; 570 | 571 | if (string.IsNullOrEmpty(text)) 572 | return false; 573 | 574 | currentPos++; 575 | if (currentPos > text.Length - 1) 576 | currentPos = 0; 577 | 578 | var nextIndex = text.IndexOf(searchText, currentPos, StringComparison.CurrentCultureIgnoreCase); 579 | if (nextIndex == -1) 580 | { 581 | nextIndex = text.IndexOf(searchText, 0, StringComparison.CurrentCultureIgnoreCase); 582 | if (nextIndex == -1) 583 | return false; 584 | } 585 | 586 | this.TxtEditor.SetSelection(nextIndex + selectLength, nextIndex); 587 | this.TxtEditor.ScrollRange(nextIndex + selectLength, nextIndex); 588 | //this.TxtEditor.Focus(); 589 | 590 | return true; 591 | } 592 | 593 | /// 594 | /// Called if Search button is clicked, opens Search form. 595 | /// 596 | /// 597 | /// 598 | private void BtnSearch_Click(object sender, EventArgs e) 599 | { 600 | if (_searchForm == null) 601 | { 602 | _searchForm = new FrmSearch(this); 603 | 604 | var x = this.Location.X + this.Width / 2 - _searchForm.Width / 2; 605 | var y = this.Location.Y + this.Height / 2 - _searchForm.Height / 2; 606 | _searchForm.Location = new Point(x, y); 607 | } 608 | 609 | if (!_searchForm.Visible) 610 | _searchForm.Show(this); 611 | else 612 | _searchForm.Focus(); 613 | 614 | _searchForm.SelectSearchText(); 615 | } 616 | 617 | /// 618 | /// Opens form to updates feature names. 619 | /// 620 | /// 621 | /// 622 | private void BtnUpdateFeatureNames_Click(object sender, EventArgs e) 623 | { 624 | var form = new FrmUpdateFeatureNames(); 625 | form.ShowDialog(); 626 | 627 | this.UpdateFeatureNames(); 628 | } 629 | 630 | /// 631 | /// Enables the feature in the line the cursor is in. 632 | /// 633 | /// 634 | /// 635 | private void MnuEnableSelected_Click(object sender, EventArgs e) 636 | { 637 | var pos = this.TxtEditor.CurrentPosition; 638 | var lineIndex = this.TxtEditor.LineFromPosition(pos); 639 | var line = this.TxtEditor.Lines[lineIndex]; 640 | var start = line.Position; 641 | var end = line.EndPosition; 642 | var text = line.Text; 643 | 644 | text = Regex.Replace(text, @" 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 237, 17 122 | 123 | 124 | 347, 17 125 | 126 | 127 | 482, 17 128 | 129 | 130 | 613, 17 131 | 132 | 133 | 132, 17 134 | 135 | 136 | 137 | 138 | iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 139 | YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKgSURBVDhPhZLbSxRhGMb3Nuh/6LqLiAitOyO66CKJCi2I 140 | uikIwgsFKTJICzOlUNfZJFbMIAqyQCivUhK3rdb1sK6nddd1Xfe8a7U6s3PYOXxP78zOjdnhhYdvmHmf 141 | 33v4xvG3GPxcQP9EBn1jKUsNL4LitYF56YprOnLyjvfe8aY3++zUP0f/pzQYgLxgoEDK8TqSRRVZXkXn 142 | WAF17XMfam4O77fT9wZHVX+IDF9iOr7FNXiiZYwuihDKDN6ECm7yO07f9XB2+t4w296WGGYTOmaTOnwb 143 | KsbDMtbzIrYEFYKi4UJrK7PT94YJ2JEZFtI6gikdMwkN3vUyxkISRoICUjTOJROwMnp0fvP9GTXxm5wE 144 | 4GVgOcssBdMG/HEV3ljZ6iTLG7hoAnwvqxXGDFoXrYyZqjw7P9IIFgBYyRpYyhiYp06mk+Y+VOQEhnoT 145 | sDRStc10GUqqG2LMCTE+BGnzHc63+2kEIJwH1gqVM0SwhTQwnYD1rc4ERF4f4Q11h8wulKIc8uPXEXFV 146 | /VdFSbMBb6tUTcohO96IxHAd4q9qsTXlRJE2bdA4Ok1UEYOmM3rHLECOL6L+/hyog2OqNb+hkCTKFMF0 147 | AaWUG3LGDSkzADE9SHqOUnoIihCxAD9LBmraJsqOiKu6zHQJStpF4mw5kV/jkAxxiC5wCM31IuB7gq+T 148 | HVhZnbIAp5o9uXO3/DsOn7taMVQeSsYE9JF6oSQfQ050QN5shRS7DSnagFL4KoTls9D4GQtg/y4OR6Dn 149 | sMzUYqVyqofMXWR8AHmjhcxNENduoLR6GcJSLfjgCQL4dwPC3Qc0dTtKV/cMUvwppI0+uhG60mgXSpGH 150 | VLkNQqiFqjeDX2yEUvDsBix3HAwGOg/JgUck8/yX7BzTU3E7HL8AbxvC5jLUgfYAAAAASUVORK5CYII= 151 | 152 | 153 | 154 | 155 | iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 156 | YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKrSURBVDhPjZLZTxNRGMX7D/lAl8El/hc+GsNW6AIEEJFN 157 | q4kPagSJRiOLVAthFUV2O4CmilCoWDCYAi1dEEqBrkCndDt+c6s8EcIkJzczc8/vnJn7STgNX67Q8E1y 158 | LW8hBTjtUJzT6tKclge9Y7pUPIkrpVO4XMIju2g8eLWUX5Bpxq5JxItT861LriiWXAJiiTQEUvQ4hdBR 159 | EruhOPyRBLsX4inshRPQ6XRpvdWZuPHItM+pR/IlnNZoW3JGca/Ph2iczLSx4MkcAgcJ7JIhEk0ycJhW 160 | z/4x1r0xGK0BTFn3wZXxMQJMhqwEuNuzwzaJEgG+cByBwwRLFhvsUBvHTgzr2wJqO9z4uhKEQq1LE2Ao 161 | bnEcEcDLNokqbDDDR+tBLIUYtQoeJuH0iekCVrcEVBtc6DV5oVCNgQC6tNl+iDvdXripoqhN/zGlJ1n6 162 | gZDClj9+YrZtRXH7zQY6p/9AXjQiAnjMrhKga5tVV1J6UaMZxc8WUEJSN81DSc/Fd/9V2bYGvdENeeEw 163 | AeiYZmwR1HVu0reRaK3r9KCuQ5QbNQY3JTpRpd9AZbsDFW3rqHxtR8uoA3LlxwzAtBLJmEkZI4kgorn6 164 | rYtVvtVOADLebF0jreLF4BpkBR8ygOnlEJk9/+Q+SWdmSq7SO5i5gozlzTaUNf9GY/8KZPkDIsAI3hpE 165 | rcHDzvs8Knn5C4+7lyHN64fkIv3EicUgqyvQkT38knemxJnQPP+JBx2LkOb2EaCYx5glQA0yAJP985kS 166 | AaqmH7jfbiFADyTZNAfD834CuM7dQNkwj/pWM7JyaBKlKuPGwPc9DMzsnvq9p6m+ZQ41r2aRdd3glyjU 167 | n54q1BOj8tyJgEI1TuM5yiZMXjgEmXKQjuo9pPnv6If1UeVeSu1hyRdyusJZuV3f/gKQ3A7m6Tg5CAAA 168 | AABJRU5ErkJggg== 169 | 170 | 171 | 172 | 173 | iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 174 | YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI2SURBVDhPzZLbT9JxGMbd+ju6Ihsj11aUBRWHMSxPUJYo 175 | GGmEgKL4M8ETIIIghDjAwxzLExLGRA1mhanhRDRntZrrYHbnJf9De0L3W4y8iMs+d8/ePd/3fZ/3m/f/ 176 | 8DipAJGQQ7Mug3qtDqplKepf1YAdZf+qmRekJKGKWHVASFRNCk+TlmyIDTkiP2fx4mAWCz8CCO/PIPR9 177 | CsGv45j4PALXVh+0L5sg9PEjZcM8BmnL0ByXYfEgiPm0cW7fj+ffJo/NM198mNobw+hHF3yfvNAvt4Hv 178 | ZkWKXDeyJ2lcqYXy9X3Il8SoWxRBOncX4tnbEPnLQURV8Ow4MPphEEPvByAPSsG2XiVI678RjPHdJV7u 179 | oWPTDFvSCN2SBkwjPUaWc4PvYrnVYTn6kyaY410o7L6QIksZKucqT1UFBHpSZsGxM93K0ENYEnoY1tpx 180 | sY128gFRQDBV8bR0j5R/4NiYboap8FC/qkPHWwIN4UcoaKFmryDylw23RJVQL8hROsLDTTcHPOd1cGwM 181 | SCbuoXtFC9NGF4zrHRB6S3BOfTYTomi63KmJKDC064Rn9wkGd/rh3O6DfasX1s0emNNja1ebYYi3Qzot 182 | Bk2dH6E0UDJnvDNebG2cl6WNNgy8s8GxbTkOy5IwoDfdtfNNK+pDtRB4i0FT5UeoCsrJj3TLy/XInknw 183 | wF8NVt8VMHsuHSUNuu48aK20VEETNUZVnSGyOv8N184Yv2a6fCLEnDk6I8NI7yRlDuTl/Qa0FCtA1YjQ 184 | KwAAAABJRU5ErkJggg== 185 | 186 | 187 | 188 | 189 | iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 190 | YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAI6SURBVDhPvZFvT1JhHIbZ+hy0ytLpdC4rkZmYMWUaYWaE 191 | wQhiahhpx3+AgGLiyURNEURRRP5YlnPrVDMkMYfL2oxBqNV7X/Id2t0hz3JN2vJN17t7z6779zzPj/Vf 192 | kS1e14sXxceYeHQkPuF2reeKm4mHaYoo2Zp3CkL9Vh5soKRJFSXB7aUbkC3UQBIQofVNEx68bITQwR9j 193 | lAM0qyquOqSgyE0jnLER+Ham8PSrG/5dF+a2JzH7xQFX3AZHdAR3nyvAHyzuZ1R68oqSnZLHo4/x4rsX 194 | 3h0nArszdIkLnoQTM3E7XLExTNCybcsKVUAGHsmxMjqLpV6RE/2bBix88/yaOh0fh3alGWKvEDXuSogm 195 | K1A1fhn1z+S4E5CCZ+HYGXWf+mVp0B61YjZhx3TMhjp/1R4tjzLHvykji7d5lsI5Jh6gouqS7oSDvu4E 196 | zGEtaj2Vh+QUF/s4RrE4zRplS6LkFP3G1CcZQm245hKkLfgr0vnq4MCGGWNbAxj+SKLKVrYneHLp30tu 197 | +q4SxGs17J+H6JJBkJEeKP23UEoWobj3AoqMBTivy8fZ9lzktWQjR5MJRt2n2lPBFjnLKe1yC4Y+kTBH 198 | 9Hj0wYy+DRN6I13oWdfBsNYB/VobOlcJZDVm/FmQQjDK55YP8yglvSbi1T2Ywp3oXtfD9F6LLlrWhVvR 199 | QcvtoWacVp04XJCixFLCLnlYSHC7zwUL23OSBaV5P/KJHOTez0J20xlkNpxCBi2fVBxPX3B0WKyf/Xkt 200 | WxTt6eMAAAAASUVORK5CYII= 201 | 202 | 203 | 204 | 205 | iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 206 | YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHySURBVDhPrZHPa9NgGMeLQq8evMgugpfh8C8QL578Cwqi 207 | hzIQ9aDHTfQSENlQlDIKhql1Yzoome12sDq3Zck2Z9u1nZ1z2Y+adE2qrbYrSpomGYSvb7rXg7SOCftA 208 | Du/7PJ/v8z7Ec2gAODKbs9gpydYmBcl5LXx2xtO/NG6pxjKkRtva48ozOUvMqDaU6i7Umg11x8bWdwv8 209 | 2k8MiSWRYfYJ4cnktGpBq+1CKplYVhtIFRrIag3IP2zEPlYx8EZmaXsr7yRTUyp2U04TcWnbQEIxsCgb 210 | e0GqgYcTOY22t+LuWyBPduVk3kCcyO+/1DGfq0PcqpNgC32c4ND2VqJC1slXbSSI/IFMXSDyHBFnN3Xw 211 | 6zpWv1nwj+4TEF4oa+v0+X+m8hs6ponsnpOKjjtPMiXa3srIfIl9m93BZtlq7t6UpT35U9FEaDqPQCBg 212 | 8ncvdFLlb9xf9HhyW4wmy8gUDKx+NbFCvoSs49lUHgPhONaifYjdPl+Z6Dn775AHrzbYe2FJc/e9PCw4 213 | vU9Txf7gcyU90oNyagzLL3sRvnGm8uJ6Z/uQdnCMzzt+61xkkb2C4lwI8cGrCPlPVmj5YHBMl3f05unI 214 | zCMf5Nh9sP4ToKWDw/m6vIPdHZHQtVMIXjrWT6//D87nORq8eLyDHg8Dj+c3bvhyU5pTU/AAAAAASUVO 215 | RK5CYII= 216 | 217 | 218 | 219 | 220 | iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 221 | YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJtSURBVDhPldPrS1phHAdwob/DRbO10WTQBcMuc0LWKu2C 222 | 6SDJfDLDYRdZrGUuu5y08syyUqvVcrVYoxZIwWy3tlKK2qUlg73uXQS9Hb37To8PhdsY6/Pux+98eQ7P 223 | 9xze/7jzrLxDtaRKouPFyX1FkZJR6Qwd/+7epo5velNnblitCWpW1Mc1zyuhnC2DwieD8YUO9fMa5HZl 224 | uenjiUxv68XG19oAE7JgbG8IM988mD3wYmrfDc+nRxjZHcBAuAfV3nIIm9L6aSzu7rqOb3ilCQzv2rHw 225 | fRqTX0fweH8M3s8uuPcGwW4zsIdt6N60QO4qhsCQ4qTRuIY1jdn24T7mIpOY2ffAteOAYVGLWw4xcm3Z 226 | yGq/gQp3CUpZGVJJ8jiNnatdVgaHQj3cic4wAwlbcFjQJ3LRNSdVL4gIdJf8dEykfHr7qGJKdFo0Kv0p 227 | ceSd5PdkM3R1JqWOb+WpeEnapWqini8nVdMlRD4uJYVsPuHJvYWkyCUhEoeYiG3ZJKNdSGKdt27prTR/ 228 | RjWnYBSe4pPYYaJu0Wl+d8YRXSVq+aj3G9drI3TkKJ+UuhQe2eHwtiPayiDa11qj9yMM0vW55g0ybt+x 229 | onfrAbTL1Yh+hYi+Mkwv9WBDDFfp0HYf1BOVuN6cZqaxONM7nZMJW7D4Y5ar1B+ZSKi0b6uTq1S/UIt0 230 | 05WAQCfg02hcw1pN/8P3bfAf+LhKfV9GMLrnBLtjR+9GJ5pWDKgaK8M1Y2pAUJ8sprFE6jm5uyXQCOMS 231 | QSFbgJtMDnKsmchsSz8WNl0NpjVeNv9x8u9iP47UnpdwiRcSq1HcldVBx3/g8X4Bj5QzBMM+BqgAAAAA 232 | SUVORK5CYII= 233 | 234 | 235 | 236 | 237 | AAABAAIAICAAAAEAIACoEAAAJgAAABAQAAABACAAaAQAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAA 238 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 239 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 240 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 241 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 242 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAANAAAADwAAAA8AAAAPAAAADwAA 243 | AA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAA 244 | AA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA0AAAACAAAADWVlZaJ5eXn/eXl5/3l5 245 | ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5 246 | ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/ZWVlogAAAA0AAAANhYWF/+/v 247 | 7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v 248 | 7//v7+//7+/v/+/v7//29vb/r62k/6+tpP+vraT/r62k/6+tpP+vraT/r62k/6+tpP96enr/AAAADQAA 249 | AAKGhob/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm 250 | 5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+/v7/+xr6b/sa+m/7Gvpv+xr6b/sa+m/7Gvpv+xr6b/sa+m/3t7 251 | e/8AAAACAAAAAIeHh//n5+f/5+fn/6Ghof/n5+f/oaGh/6Ghof+hoaH/5+fn/+fn5/+hoaH/oaGh/+fn 252 | 5/+hoaH/oaGh/+fn5/+hoaH/oaGh/6Ghof/n5+f/8PDw/7Oyqf9paWT/kZCJ/5GQif+RkIn/kZCJ/5GQ 253 | if+zsqn/fHx8/wAAAAAAAAAAiYmJ/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np 254 | 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/x8fH/trWs/7a1rP+2taz/trWs/7a1 255 | rP+2taz/trWs/7a1rP9+fn7/AAAAAAAAAACLi4v/6+vr/+vr6/+kpKT/pKSk/6SkpP/r6+v/pKSk/6Sk 256 | pP/r6+v/6+vr/6SkpP+kpKT/6+vr/6SkpP+kpKT/pKSk/+vr6/+kpKT/6+vr//Ly8v+5t6//bWxn/5aV 257 | jv+WlY7/lpWO/5aVjv+WlY7/ubev/39/f/8AAAAAAAAAAIyMjP/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t 258 | 7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/9PT0/7y7 259 | sv+8u7L/vLuy/7y7sv+8u7L/vLuy/7y7sv+8u7L/gICA/wAAAAAAAAAAjo6O/+/v7//v7+//p6en/6en 260 | p/+np6f/p6en/+/v7/+np6f/7+/v/+/v7/+np6f/7+/v/6enp/+np6f/7+/v/+/v7/+np6f/p6en/+/v 261 | 7//19fX/v761/3Bvav+bmpP/m5qT/5uak/+bmpP/m5qT/7++tf+CgoL/AAAAAAAAAACQkJD/8fHx//Hx 262 | 8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx 263 | 8f/x8fH/8fHx//b29v/Dwbn/w8G5/8PBuf/Dwbn/w8G5/8PBuf/Dwbn/w8G5/4ODg/8AAAAAAAAAAJGR 264 | kf/y8vL/8vLy/6mpqf+pqan/8vLy/6mpqf+pqan/qamp//Ly8v/y8vL/qamp/6mpqf+pqan/8vLy/6mp 265 | qf+pqan/8vLy/6mpqf/y8vL/9/f3/8bEvP91c2//oZ+Z/6Gfmf+hn5n/oZ+Z/6Gfmf/GxLz/hISE/wAA 266 | AAAAAAAAk5OT//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 267 | 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/4+Pj/ysi//8rIv//KyL//ysi//8rIv//KyL//ysi//8rI 268 | v/+Ghob/AAAAAAAAAACVlZX/9vb2//b29v+srKz/rKys/6ysrP/29vb/rKys/6ysrP/29vb/9vb2/6ys 269 | rP+srKz/9vb2/6ysrP+srKz/rKys//b29v+srKz/9vb2//n5+f/Ny8P/eHdy/6alnv+mpZ7/pqWe/6al 270 | nv+mpZ7/zcvD/4eHh/8AAAAAAAAAAJeXl//4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4 271 | +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+/v7/9DOxv/Qzsb/0M7G/9DO 272 | xv/Qzsb/0M7G/9DOxv/Qzsb/iYmJ/wAAAAAAAAAAmZmZ//r6+v/6+vr/r6+v/6+vr/+vr6//r6+v//r6 273 | +v+vr6//+vr6//r6+v+vr6//+vr6/6+vr/+vr6//+vr6//r6+v+vr6//r6+v//r6+v/8/Pz/09HJ/3x7 274 | dv+rqqP/q6qj/6uqo/+rqqP/q6qj/9PRyf+Li4v/AAAAAAAAAACampr//Pz8//z8/P/8/Pz//Pz8//z8 275 | /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//39 276 | /f/W1Mz/1tTM/9bUzP/W1Mz/1tTM/9bUzP/W1Mz/1tTM/4uLi/8AAAAAAAAAAJycnP/9/f3//f39/7Gx 277 | sf+xsbH//f39/7Gxsf+xsbH/sbGx//39/f/9/f3/sbGx/7Gxsf+xsbH//f39/7Gxsf+xsbH//f39/7Gx 278 | sf/9/f3//v7+/7V4Kv+1eCr/tXgq/7V4Kv+1eCr/tXgq/7V4Kv+1eCr/jY2N/wAAAAAAAAAAnp6e//7+ 279 | /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ 280 | /v/+/v7//v7+//7+/v/+/v7/04wx/9OMMf/TjDH/04wx/9OMMf/TjDH/04wx/9OMMf+Pj4//AAAAAAAA 281 | AACfn5////////////////////////////////////////////////////////////////////////// 282 | ///////////////////////////////////c2tL/3NrS/9za0v/c2tL/3NrS/9za0v/c2tL/3NrS/4+P 283 | j/8AAAAAAAAAAKGhof+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eX 284 | l/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eX 285 | l/+Xl5f/goKC/wAAAAAAAAAAo6Oj/76+vv++vr7/vr6+/76+vv++vr7/vr6+/76+vv++vr7/vr6+/76+ 286 | vv++vr7/vr6+/76+vv++vr7/vr6+/76+vv+ovKz/iLmS/6i8rP++vr7/p7y//4a6wP+uvb//vr6+/6ur 287 | xf+Pj9D/q6vF/76+vv+Tk5P/AAAAAAAAAACkpKT/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HB 288 | wf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/z6yVv8a5yn/PrJW/8HBwf84tcT/KP/y/zi1 289 | xP/BwcH/T0/q/3Nz//9PT+r/wcHB/5OTk/8AAAAAAAAAAKWlpf/CwsL/wsLC/8LCwv/CwsL/wsLC/8LC 290 | wv/CwsL/wsLC/8LCwv/CwsL/wsLC/8LCwv/CwsL/wsLC/8LCwv/CwsL/jLyX/wetK/+MvJf/wsLC/4q9 291 | w/8Ascb/ir3D/8LCwv+UlNP/ISH8/5SU0//CwsL/lJSU/wAAAAAAAAAApqam/87Ozv/V1dX/1dXV/9XV 292 | 1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV 293 | 1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f+VlZX/AAAAAAAAAACnp6dXp6en/6en 294 | p/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6en 295 | p/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp1cAAAAAAAAAAAAA 296 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 297 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 298 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 299 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 300 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 301 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 302 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 303 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 304 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 305 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 306 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////AAAAAAAAAAAAAAAAAAAAAIAA 307 | AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA 308 | AAGAAAABgAAAAYAAAAGAAAABgAAAAf//////////////////////////KAAAABAAAAAgAAAAAQAgAAAA 309 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 310 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGRkwPDw8hzw8PIc8PDyHPDw8hzw8PIc8PDyHPDw8hzw8 311 | PIc8PDyHPDw8hzw8PIc8PDyHPDw8hzw8PIcZGRkwQkJCg+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq 312 | 6v/q6ur/6urq/+7u7v+wrqX/sK6l/7Cupf+wrqX/PT09g4iIiIDo6Oj/1tbW/8XFxf/W1tb/1tbW/9bW 313 | 1v/FxcX/1tbW/8XFxf/s7Oz/oqGZ/6Oimv+jopr/rKui/319fYCLi4uA7Ozs/8jIyP/a2tr/yMjI/+zs 314 | 7P/IyMj/2tra/8jIyP/a2tr/7+/v/6emnv+pqKD/qaig/7GwqP9/f3+Aj4+PgPDw8P/MzMz/zMzM/97e 315 | 3v/w8PD/3t7e/8zMzP/w8PD/zMzM//Ly8v+tq6T/r62m/6+tpv+4tq7/goKCgJKSkoDz8/P/zs7O/+Dg 316 | 4P/Ozs7/8/Pz/87Ozv/g4OD/zs7O/+Dg4P/19fX/s7Gq/7WzrP+1s6z/vry0/4WFhYCWlpaA9/f3/9LS 317 | 0v/k5OT/0tLS//f39//S0tL/5OTk/9LS0v/k5OT/+Pj4/7m3sP+7ubL/u7my/8TDu/+IiIiAmZmZgPv7 318 | +//V1dX/1dXV/+jo6P/7+/v/6Ojo/9XV1f/7+/v/1dXV//v7+/++vbX/wL+3/8C/t//KyMH/i4uLgJ2d 319 | nYD9/f3/19fX/+rq6v/X19f//f39/9fX1//q6ur/19fX/+rq6v/9/f3/xIIt/8SCLf/Egi3/xIIt/46O 320 | joCgoKCAy8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/7m4tP+5uLT/ubi0/7m4 321 | tP+IiIiAo6OjgL+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//YsNv/5m7oP9jys3/mbzA/39/ 322 | 3/+ensv/k5OTgKWlpYDJycn/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/4/Em/++ysD/jcbM/73K 323 | y/+Xl97/wMDP/5SUlICnp6cWp6engKenp4Cnp6eAp6engKenp4Cnp6eAp6engKenp4Cnp6eAp6engKen 324 | p4Cnp6eAp6engKenp4Cnp6cWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 325 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 326 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//6xBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA 327 | rEEAAKxBAACsQQAArEEAAKxBAACsQf//rEH//6xB 328 | 329 | 330 | -------------------------------------------------------------------------------- /Fetitor/FrmSearch.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace Fetitor 2 | { 3 | partial class FrmSearch 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmSearch)); 32 | this.TxtSearchText = new System.Windows.Forms.TextBox(); 33 | this.label1 = new System.Windows.Forms.Label(); 34 | this.BtnSearch = new System.Windows.Forms.Button(); 35 | this.BtnClose = new System.Windows.Forms.Button(); 36 | this.SuspendLayout(); 37 | // 38 | // TxtSearchText 39 | // 40 | this.TxtSearchText.Location = new System.Drawing.Point(74, 12); 41 | this.TxtSearchText.Name = "TxtSearchText"; 42 | this.TxtSearchText.Size = new System.Drawing.Size(289, 20); 43 | this.TxtSearchText.TabIndex = 0; 44 | // 45 | // label1 46 | // 47 | this.label1.AutoSize = true; 48 | this.label1.Location = new System.Drawing.Point(12, 15); 49 | this.label1.Name = "label1"; 50 | this.label1.Size = new System.Drawing.Size(56, 13); 51 | this.label1.TabIndex = 1; 52 | this.label1.Text = "Search for"; 53 | // 54 | // BtnSearch 55 | // 56 | this.BtnSearch.Location = new System.Drawing.Point(207, 38); 57 | this.BtnSearch.Name = "BtnSearch"; 58 | this.BtnSearch.Size = new System.Drawing.Size(75, 23); 59 | this.BtnSearch.TabIndex = 2; 60 | this.BtnSearch.Text = "Search"; 61 | this.BtnSearch.UseVisualStyleBackColor = true; 62 | this.BtnSearch.Click += new System.EventHandler(this.BtnSearch_Click); 63 | // 64 | // BtnClose 65 | // 66 | this.BtnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel; 67 | this.BtnClose.Location = new System.Drawing.Point(288, 38); 68 | this.BtnClose.Name = "BtnClose"; 69 | this.BtnClose.Size = new System.Drawing.Size(75, 23); 70 | this.BtnClose.TabIndex = 3; 71 | this.BtnClose.Text = "Close"; 72 | this.BtnClose.UseVisualStyleBackColor = true; 73 | this.BtnClose.Click += new System.EventHandler(this.BtnClose_Click); 74 | // 75 | // FrmSearch 76 | // 77 | this.AcceptButton = this.BtnSearch; 78 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 79 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 80 | this.CancelButton = this.BtnClose; 81 | this.ClientSize = new System.Drawing.Size(375, 71); 82 | this.Controls.Add(this.BtnClose); 83 | this.Controls.Add(this.BtnSearch); 84 | this.Controls.Add(this.label1); 85 | this.Controls.Add(this.TxtSearchText); 86 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 87 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 88 | this.MaximizeBox = false; 89 | this.MinimizeBox = false; 90 | this.Name = "FrmSearch"; 91 | this.ShowIcon = false; 92 | this.ShowInTaskbar = false; 93 | this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; 94 | this.Text = "Search"; 95 | this.Activated += new System.EventHandler(this.FrmSearch_Activated); 96 | this.Deactivate += new System.EventHandler(this.FrmSearch_Deactivate); 97 | this.ResumeLayout(false); 98 | this.PerformLayout(); 99 | 100 | } 101 | 102 | #endregion 103 | 104 | private System.Windows.Forms.TextBox TxtSearchText; 105 | private System.Windows.Forms.Label label1; 106 | private System.Windows.Forms.Button BtnSearch; 107 | private System.Windows.Forms.Button BtnClose; 108 | } 109 | } -------------------------------------------------------------------------------- /Fetitor/FrmSearch.cs: -------------------------------------------------------------------------------- 1 | // This program is free software: you can redistribute it and/or modify 2 | // it under the terms of the GNU General Public License as published by 3 | // the Free Software Foundation, either version 3 of the License, or 4 | // (at your option) any later version. 5 | // 6 | // This program is distributed in the hope that it will be useful, 7 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 8 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 | // GNU General Public License for more details. 10 | // 11 | // You should have received a copy of the GNU General Public License 12 | // along with this program. If not, see . 13 | 14 | using System; 15 | using System.Windows.Forms; 16 | 17 | namespace Fetitor 18 | { 19 | /// 20 | /// Provides a form to input a search text. 21 | /// 22 | public partial class FrmSearch : Form 23 | { 24 | private FrmMain _mainForm; 25 | 26 | /// 27 | /// Creates new instance. 28 | /// 29 | /// 30 | public FrmSearch(FrmMain mainForm) 31 | { 32 | InitializeComponent(); 33 | _mainForm = mainForm; 34 | } 35 | 36 | /// 37 | /// Hides form. 38 | /// 39 | /// 40 | /// 41 | private void BtnClose_Click(object sender, EventArgs e) 42 | { 43 | this.Hide(); 44 | } 45 | 46 | /// 47 | /// Calls search method on main form. 48 | /// 49 | /// 50 | /// 51 | private void BtnSearch_Click(object sender, EventArgs e) 52 | { 53 | var searchText = this.TxtSearchText.Text; 54 | 55 | if (!_mainForm.SearchFor(searchText)) 56 | MessageBox.Show("Text not found.", "Search", MessageBoxButtons.OK, MessageBoxIcon.Information); 57 | } 58 | 59 | /// 60 | /// Selects the search text. 61 | /// 62 | public void SelectSearchText() 63 | { 64 | this.TxtSearchText.Focus(); 65 | this.TxtSearchText.SelectAll(); 66 | } 67 | 68 | /// 69 | /// Changes opacity when the form's focus changes. 70 | /// 71 | /// 72 | /// 73 | private void FrmSearch_Deactivate(object sender, EventArgs e) 74 | { 75 | this.Opacity = 0.8; 76 | } 77 | 78 | /// 79 | /// Changes opacity when the form's focus changes. 80 | /// 81 | /// 82 | /// 83 | private void FrmSearch_Activated(object sender, EventArgs e) 84 | { 85 | this.Opacity = 1; 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /Fetitor/FrmSearch.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | 123 | AAABAAIAICAAAAEAIACoEAAAJgAAABAQAAABACAAaAQAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAA 124 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 125 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 126 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 127 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 128 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAANAAAADwAAAA8AAAAPAAAADwAA 129 | AA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAA 130 | AA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA0AAAACAAAADWVlZaJ5eXn/eXl5/3l5 131 | ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5 132 | ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/eXl5/3l5ef95eXn/ZWVlogAAAA0AAAANhYWF/+/v 133 | 7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v 134 | 7//v7+//7+/v/+/v7//29vb/r62k/6+tpP+vraT/r62k/6+tpP+vraT/r62k/6+tpP96enr/AAAADQAA 135 | AAKGhob/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+bm 136 | 5v/m5ub/5ubm/+bm5v/m5ub/5ubm/+/v7/+xr6b/sa+m/7Gvpv+xr6b/sa+m/7Gvpv+xr6b/sa+m/3t7 137 | e/8AAAACAAAAAIeHh//n5+f/5+fn/6Ghof/n5+f/oaGh/6Ghof+hoaH/5+fn/+fn5/+hoaH/oaGh/+fn 138 | 5/+hoaH/oaGh/+fn5/+hoaH/oaGh/6Ghof/n5+f/8PDw/7Oyqf9paWT/kZCJ/5GQif+RkIn/kZCJ/5GQ 139 | if+zsqn/fHx8/wAAAAAAAAAAiYmJ/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np 140 | 6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/x8fH/trWs/7a1rP+2taz/trWs/7a1 141 | rP+2taz/trWs/7a1rP9+fn7/AAAAAAAAAACLi4v/6+vr/+vr6/+kpKT/pKSk/6SkpP/r6+v/pKSk/6Sk 142 | pP/r6+v/6+vr/6SkpP+kpKT/6+vr/6SkpP+kpKT/pKSk/+vr6/+kpKT/6+vr//Ly8v+5t6//bWxn/5aV 143 | jv+WlY7/lpWO/5aVjv+WlY7/ubev/39/f/8AAAAAAAAAAIyMjP/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t 144 | 7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/7e3t/+3t7f/t7e3/9PT0/7y7 145 | sv+8u7L/vLuy/7y7sv+8u7L/vLuy/7y7sv+8u7L/gICA/wAAAAAAAAAAjo6O/+/v7//v7+//p6en/6en 146 | p/+np6f/p6en/+/v7/+np6f/7+/v/+/v7/+np6f/7+/v/6enp/+np6f/7+/v/+/v7/+np6f/p6en/+/v 147 | 7//19fX/v761/3Bvav+bmpP/m5qT/5uak/+bmpP/m5qT/7++tf+CgoL/AAAAAAAAAACQkJD/8fHx//Hx 148 | 8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx 149 | 8f/x8fH/8fHx//b29v/Dwbn/w8G5/8PBuf/Dwbn/w8G5/8PBuf/Dwbn/w8G5/4ODg/8AAAAAAAAAAJGR 150 | kf/y8vL/8vLy/6mpqf+pqan/8vLy/6mpqf+pqan/qamp//Ly8v/y8vL/qamp/6mpqf+pqan/8vLy/6mp 151 | qf+pqan/8vLy/6mpqf/y8vL/9/f3/8bEvP91c2//oZ+Z/6Gfmf+hn5n/oZ+Z/6Gfmf/GxLz/hISE/wAA 152 | AAAAAAAAk5OT//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0 153 | 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/4+Pj/ysi//8rIv//KyL//ysi//8rIv//KyL//ysi//8rI 154 | v/+Ghob/AAAAAAAAAACVlZX/9vb2//b29v+srKz/rKys/6ysrP/29vb/rKys/6ysrP/29vb/9vb2/6ys 155 | rP+srKz/9vb2/6ysrP+srKz/rKys//b29v+srKz/9vb2//n5+f/Ny8P/eHdy/6alnv+mpZ7/pqWe/6al 156 | nv+mpZ7/zcvD/4eHh/8AAAAAAAAAAJeXl//4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4 157 | +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+/v7/9DOxv/Qzsb/0M7G/9DO 158 | xv/Qzsb/0M7G/9DOxv/Qzsb/iYmJ/wAAAAAAAAAAmZmZ//r6+v/6+vr/r6+v/6+vr/+vr6//r6+v//r6 159 | +v+vr6//+vr6//r6+v+vr6//+vr6/6+vr/+vr6//+vr6//r6+v+vr6//r6+v//r6+v/8/Pz/09HJ/3x7 160 | dv+rqqP/q6qj/6uqo/+rqqP/q6qj/9PRyf+Li4v/AAAAAAAAAACampr//Pz8//z8/P/8/Pz//Pz8//z8 161 | /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//39 162 | /f/W1Mz/1tTM/9bUzP/W1Mz/1tTM/9bUzP/W1Mz/1tTM/4uLi/8AAAAAAAAAAJycnP/9/f3//f39/7Gx 163 | sf+xsbH//f39/7Gxsf+xsbH/sbGx//39/f/9/f3/sbGx/7Gxsf+xsbH//f39/7Gxsf+xsbH//f39/7Gx 164 | sf/9/f3//v7+/7V4Kv+1eCr/tXgq/7V4Kv+1eCr/tXgq/7V4Kv+1eCr/jY2N/wAAAAAAAAAAnp6e//7+ 165 | /v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+ 166 | /v/+/v7//v7+//7+/v/+/v7/04wx/9OMMf/TjDH/04wx/9OMMf/TjDH/04wx/9OMMf+Pj4//AAAAAAAA 167 | AACfn5////////////////////////////////////////////////////////////////////////// 168 | ///////////////////////////////////c2tL/3NrS/9za0v/c2tL/3NrS/9za0v/c2tL/3NrS/4+P 169 | j/8AAAAAAAAAAKGhof+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eX 170 | l/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eXl/+Xl5f/l5eX/5eX 171 | l/+Xl5f/goKC/wAAAAAAAAAAo6Oj/76+vv++vr7/vr6+/76+vv++vr7/vr6+/76+vv++vr7/vr6+/76+ 172 | vv++vr7/vr6+/76+vv++vr7/vr6+/76+vv+ovKz/iLmS/6i8rP++vr7/p7y//4a6wP+uvb//vr6+/6ur 173 | xf+Pj9D/q6vF/76+vv+Tk5P/AAAAAAAAAACkpKT/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HB 174 | wf/BwcH/wcHB/8HBwf/BwcH/wcHB/8HBwf/BwcH/wcHB/z6yVv8a5yn/PrJW/8HBwf84tcT/KP/y/zi1 175 | xP/BwcH/T0/q/3Nz//9PT+r/wcHB/5OTk/8AAAAAAAAAAKWlpf/CwsL/wsLC/8LCwv/CwsL/wsLC/8LC 176 | wv/CwsL/wsLC/8LCwv/CwsL/wsLC/8LCwv/CwsL/wsLC/8LCwv/CwsL/jLyX/wetK/+MvJf/wsLC/4q9 177 | w/8Ascb/ir3D/8LCwv+UlNP/ISH8/5SU0//CwsL/lJSU/wAAAAAAAAAApqam/87Ozv/V1dX/1dXV/9XV 178 | 1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV 179 | 1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f/V1dX/1dXV/9XV1f+VlZX/AAAAAAAAAACnp6dXp6en/6en 180 | p/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6en 181 | p/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp/+np6f/p6en/6enp1cAAAAAAAAAAAAA 182 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 183 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 184 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 185 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 186 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 187 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 188 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 189 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 190 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 191 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 192 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////AAAAAAAAAAAAAAAAAAAAAIAA 193 | AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA 194 | AAGAAAABgAAAAYAAAAGAAAABgAAAAf//////////////////////////KAAAABAAAAAgAAAAAQAgAAAA 195 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 196 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGRkwPDw8hzw8PIc8PDyHPDw8hzw8PIc8PDyHPDw8hzw8 197 | PIc8PDyHPDw8hzw8PIc8PDyHPDw8hzw8PIcZGRkwQkJCg+rq6v/q6ur/6urq/+rq6v/q6ur/6urq/+rq 198 | 6v/q6ur/6urq/+7u7v+wrqX/sK6l/7Cupf+wrqX/PT09g4iIiIDo6Oj/1tbW/8XFxf/W1tb/1tbW/9bW 199 | 1v/FxcX/1tbW/8XFxf/s7Oz/oqGZ/6Oimv+jopr/rKui/319fYCLi4uA7Ozs/8jIyP/a2tr/yMjI/+zs 200 | 7P/IyMj/2tra/8jIyP/a2tr/7+/v/6emnv+pqKD/qaig/7GwqP9/f3+Aj4+PgPDw8P/MzMz/zMzM/97e 201 | 3v/w8PD/3t7e/8zMzP/w8PD/zMzM//Ly8v+tq6T/r62m/6+tpv+4tq7/goKCgJKSkoDz8/P/zs7O/+Dg 202 | 4P/Ozs7/8/Pz/87Ozv/g4OD/zs7O/+Dg4P/19fX/s7Gq/7WzrP+1s6z/vry0/4WFhYCWlpaA9/f3/9LS 203 | 0v/k5OT/0tLS//f39//S0tL/5OTk/9LS0v/k5OT/+Pj4/7m3sP+7ubL/u7my/8TDu/+IiIiAmZmZgPv7 204 | +//V1dX/1dXV/+jo6P/7+/v/6Ojo/9XV1f/7+/v/1dXV//v7+/++vbX/wL+3/8C/t//KyMH/i4uLgJ2d 205 | nYD9/f3/19fX/+rq6v/X19f//f39/9fX1//q6ur/19fX/+rq6v/9/f3/xIIt/8SCLf/Egi3/xIIt/46O 206 | joCgoKCAy8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/7m4tP+5uLT/ubi0/7m4 207 | tP+IiIiAo6OjgL+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//YsNv/5m7oP9jys3/mbzA/39/ 208 | 3/+ensv/k5OTgKWlpYDJycn/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/4/Em/++ysD/jcbM/73K 209 | y/+Xl97/wMDP/5SUlICnp6cWp6engKenp4Cnp6eAp6engKenp4Cnp6eAp6engKenp4Cnp6eAp6engKen 210 | p4Cnp6eAp6engKenp4Cnp6cWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 211 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 212 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//6xBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAA 213 | rEEAAKxBAACsQQAArEEAAKxBAACsQf//rEH//6xB 214 | 215 | 216 | -------------------------------------------------------------------------------- /Fetitor/FrmUpdateFeatureNames.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace Fetitor 2 | { 3 | partial class FrmUpdateFeatureNames 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmUpdateFeatureNames)); 32 | this.LblHelp = new System.Windows.Forms.Label(); 33 | this.GrpFolders = new System.Windows.Forms.GroupBox(); 34 | this.ChkIncludeCurrent = new System.Windows.Forms.CheckBox(); 35 | this.TxtFolders = new System.Windows.Forms.TextBox(); 36 | this.GrpResults = new System.Windows.Forms.GroupBox(); 37 | this.TxtResults = new System.Windows.Forms.TextBox(); 38 | this.ProgressBar = new System.Windows.Forms.ProgressBar(); 39 | this.BtnSave = new System.Windows.Forms.Button(); 40 | this.BtnClose = new System.Windows.Forms.Button(); 41 | this.BtnSearch = new System.Windows.Forms.Button(); 42 | this.GrpFolders.SuspendLayout(); 43 | this.GrpResults.SuspendLayout(); 44 | this.SuspendLayout(); 45 | // 46 | // LblHelp 47 | // 48 | this.LblHelp.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 49 | | System.Windows.Forms.AnchorStyles.Right))); 50 | this.LblHelp.ForeColor = System.Drawing.Color.Gray; 51 | this.LblHelp.Location = new System.Drawing.Point(9, 407); 52 | this.LblHelp.Name = "LblHelp"; 53 | this.LblHelp.Size = new System.Drawing.Size(516, 48); 54 | this.LblHelp.TabIndex = 0; 55 | this.LblHelp.Text = resources.GetString("LblHelp.Text"); 56 | // 57 | // GrpFolders 58 | // 59 | this.GrpFolders.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 60 | | System.Windows.Forms.AnchorStyles.Right))); 61 | this.GrpFolders.Controls.Add(this.ChkIncludeCurrent); 62 | this.GrpFolders.Controls.Add(this.TxtFolders); 63 | this.GrpFolders.Location = new System.Drawing.Point(12, 12); 64 | this.GrpFolders.Name = "GrpFolders"; 65 | this.GrpFolders.Size = new System.Drawing.Size(513, 185); 66 | this.GrpFolders.TabIndex = 3; 67 | this.GrpFolders.TabStop = false; 68 | this.GrpFolders.Text = "Directories"; 69 | // 70 | // ChkIncludeCurrent 71 | // 72 | this.ChkIncludeCurrent.AutoSize = true; 73 | this.ChkIncludeCurrent.Checked = true; 74 | this.ChkIncludeCurrent.CheckState = System.Windows.Forms.CheckState.Checked; 75 | this.ChkIncludeCurrent.Location = new System.Drawing.Point(11, 161); 76 | this.ChkIncludeCurrent.Name = "ChkIncludeCurrent"; 77 | this.ChkIncludeCurrent.Size = new System.Drawing.Size(204, 17); 78 | this.ChkIncludeCurrent.TabIndex = 5; 79 | this.ChkIncludeCurrent.Text = "Include features in current features.txt"; 80 | this.ChkIncludeCurrent.UseVisualStyleBackColor = true; 81 | // 82 | // TxtFolders 83 | // 84 | this.TxtFolders.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 85 | | System.Windows.Forms.AnchorStyles.Left) 86 | | System.Windows.Forms.AnchorStyles.Right))); 87 | this.TxtFolders.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 88 | this.TxtFolders.Location = new System.Drawing.Point(11, 19); 89 | this.TxtFolders.Multiline = true; 90 | this.TxtFolders.Name = "TxtFolders"; 91 | this.TxtFolders.ScrollBars = System.Windows.Forms.ScrollBars.Both; 92 | this.TxtFolders.Size = new System.Drawing.Size(491, 136); 93 | this.TxtFolders.TabIndex = 4; 94 | this.TxtFolders.WordWrap = false; 95 | // 96 | // GrpResults 97 | // 98 | this.GrpResults.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 99 | | System.Windows.Forms.AnchorStyles.Right))); 100 | this.GrpResults.Controls.Add(this.TxtResults); 101 | this.GrpResults.Location = new System.Drawing.Point(12, 203); 102 | this.GrpResults.Name = "GrpResults"; 103 | this.GrpResults.Size = new System.Drawing.Size(513, 158); 104 | this.GrpResults.TabIndex = 4; 105 | this.GrpResults.TabStop = false; 106 | this.GrpResults.Text = "Results"; 107 | // 108 | // TxtResults 109 | // 110 | this.TxtResults.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 111 | | System.Windows.Forms.AnchorStyles.Left) 112 | | System.Windows.Forms.AnchorStyles.Right))); 113 | this.TxtResults.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 114 | this.TxtResults.Location = new System.Drawing.Point(11, 19); 115 | this.TxtResults.Multiline = true; 116 | this.TxtResults.Name = "TxtResults"; 117 | this.TxtResults.ReadOnly = true; 118 | this.TxtResults.ScrollBars = System.Windows.Forms.ScrollBars.Both; 119 | this.TxtResults.Size = new System.Drawing.Size(491, 128); 120 | this.TxtResults.TabIndex = 6; 121 | this.TxtResults.WordWrap = false; 122 | // 123 | // ProgressBar 124 | // 125 | this.ProgressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 126 | | System.Windows.Forms.AnchorStyles.Right))); 127 | this.ProgressBar.Location = new System.Drawing.Point(12, 370); 128 | this.ProgressBar.Name = "ProgressBar"; 129 | this.ProgressBar.Size = new System.Drawing.Size(270, 23); 130 | this.ProgressBar.TabIndex = 5; 131 | // 132 | // BtnSave 133 | // 134 | this.BtnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 135 | this.BtnSave.Enabled = false; 136 | this.BtnSave.Location = new System.Drawing.Point(369, 370); 137 | this.BtnSave.Name = "BtnSave"; 138 | this.BtnSave.Size = new System.Drawing.Size(75, 23); 139 | this.BtnSave.TabIndex = 2; 140 | this.BtnSave.Text = "Save"; 141 | this.BtnSave.UseVisualStyleBackColor = true; 142 | this.BtnSave.Click += new System.EventHandler(this.BtnSave_Click); 143 | // 144 | // BtnClose 145 | // 146 | this.BtnClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 147 | this.BtnClose.Location = new System.Drawing.Point(450, 370); 148 | this.BtnClose.Name = "BtnClose"; 149 | this.BtnClose.Size = new System.Drawing.Size(75, 23); 150 | this.BtnClose.TabIndex = 3; 151 | this.BtnClose.Text = "Close"; 152 | this.BtnClose.UseVisualStyleBackColor = true; 153 | this.BtnClose.Click += new System.EventHandler(this.BtnClose_Click); 154 | // 155 | // BtnSearch 156 | // 157 | this.BtnSearch.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 158 | this.BtnSearch.Location = new System.Drawing.Point(288, 370); 159 | this.BtnSearch.Name = "BtnSearch"; 160 | this.BtnSearch.Size = new System.Drawing.Size(75, 23); 161 | this.BtnSearch.TabIndex = 1; 162 | this.BtnSearch.Text = "Search"; 163 | this.BtnSearch.UseVisualStyleBackColor = true; 164 | this.BtnSearch.Click += new System.EventHandler(this.BtnSearch_Click); 165 | // 166 | // FrmUpdateFeatureNames 167 | // 168 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 169 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 170 | this.ClientSize = new System.Drawing.Size(537, 464); 171 | this.Controls.Add(this.BtnSearch); 172 | this.Controls.Add(this.BtnClose); 173 | this.Controls.Add(this.BtnSave); 174 | this.Controls.Add(this.ProgressBar); 175 | this.Controls.Add(this.GrpResults); 176 | this.Controls.Add(this.GrpFolders); 177 | this.Controls.Add(this.LblHelp); 178 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; 179 | this.MaximizeBox = false; 180 | this.MinimizeBox = false; 181 | this.Name = "FrmUpdateFeatureNames"; 182 | this.ShowIcon = false; 183 | this.ShowInTaskbar = false; 184 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 185 | this.Text = "Search Feature Names"; 186 | this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmUpdateFeatureNames_FormClosing); 187 | this.GrpFolders.ResumeLayout(false); 188 | this.GrpFolders.PerformLayout(); 189 | this.GrpResults.ResumeLayout(false); 190 | this.GrpResults.PerformLayout(); 191 | this.ResumeLayout(false); 192 | 193 | } 194 | 195 | #endregion 196 | 197 | private System.Windows.Forms.Label LblHelp; 198 | private System.Windows.Forms.GroupBox GrpFolders; 199 | private System.Windows.Forms.TextBox TxtFolders; 200 | private System.Windows.Forms.GroupBox GrpResults; 201 | private System.Windows.Forms.TextBox TxtResults; 202 | private System.Windows.Forms.ProgressBar ProgressBar; 203 | private System.Windows.Forms.Button BtnSave; 204 | private System.Windows.Forms.Button BtnClose; 205 | private System.Windows.Forms.Button BtnSearch; 206 | private System.Windows.Forms.CheckBox ChkIncludeCurrent; 207 | } 208 | } 209 | -------------------------------------------------------------------------------- /Fetitor/FrmUpdateFeatureNames.cs: -------------------------------------------------------------------------------- 1 | // This program is free software: you can redistribute it and/or modify 2 | // it under the terms of the GNU General Public License as published by 3 | // the Free Software Foundation, either version 3 of the License, or 4 | // (at your option) any later version. 5 | // 6 | // This program is distributed in the hope that it will be useful, 7 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 8 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 | // GNU General Public License for more details. 10 | // 11 | // You should have received a copy of the GNU General Public License 12 | // along with this program. If not, see . 13 | 14 | using System; 15 | using System.Collections.Generic; 16 | using System.IO; 17 | using System.Linq; 18 | using System.Text; 19 | using System.Text.RegularExpressions; 20 | using System.Threading.Tasks; 21 | using System.Windows.Forms; 22 | using Fetitor.Properties; 23 | 24 | namespace Fetitor 25 | { 26 | /// 27 | /// Provides a form to update the features.txt. 28 | /// 29 | public partial class FrmUpdateFeatureNames : Form 30 | { 31 | private readonly static string[] FileExtensions = new[] { ".xml", ".txt", ".data" }; 32 | private readonly static string FeaturesListPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "features.txt"); 33 | private readonly static Regex GfRegex = new Regex(@"(gf[a-zA-Z][\w\-]+)", RegexOptions.Compiled); 34 | private readonly static Regex FeatureStrRegex = new Regex(@"(feature[a-zA-Z][\w\-]+)", RegexOptions.Compiled); 35 | private readonly static Regex FeatureAttr1Regex = new Regex(@"feature\s*=\s*""([^""]+)""", RegexOptions.Compiled | RegexOptions.IgnoreCase); 36 | private readonly static Regex FeatureAttr2Regex = new Regex(@"feature\s*=\s*"([^&]+)"", RegexOptions.Compiled | RegexOptions.IgnoreCase); 37 | 38 | private bool _closing; 39 | 40 | /// 41 | /// Creates new instance. 42 | /// 43 | public FrmUpdateFeatureNames() 44 | { 45 | InitializeComponent(); 46 | 47 | this.TxtFolders.Text = Settings.Default.NameSearchFolders; 48 | this.TxtFolders.SelectionStart = 0; 49 | this.BtnSave.Select(); 50 | } 51 | 52 | /// 53 | /// Called when closing the form. 54 | /// 55 | /// 56 | /// 57 | private void FrmUpdateFeatureNames_FormClosing(object sender, FormClosingEventArgs e) 58 | { 59 | _closing = true; 60 | Settings.Default.NameSearchFolders = this.TxtFolders.Text; 61 | } 62 | 63 | /// 64 | /// Closes form. 65 | /// 66 | /// 67 | /// 68 | private void BtnClose_Click(object sender, EventArgs e) 69 | { 70 | this.Close(); 71 | } 72 | 73 | /// 74 | /// Saves the results to the features.txt 75 | /// 76 | /// 77 | /// 78 | private void BtnSave_Click(object sender, EventArgs e) 79 | { 80 | this.BtnSave.Enabled = false; 81 | File.WriteAllText(FeaturesListPath, this.TxtResults.Text); 82 | } 83 | 84 | /// 85 | /// Starts search for feature names. 86 | /// 87 | /// 88 | /// 89 | private void BtnSearch_Click(object sender, EventArgs e) 90 | { 91 | var folderPaths = this.TxtFolders.Lines; 92 | var includeCurrent = this.ChkIncludeCurrent.Checked; 93 | 94 | this.BtnSearch.Enabled = false; 95 | this.BtnSave.Enabled = false; 96 | this.GrpFolders.Enabled = false; 97 | this.ProgressBar.Value = 0; 98 | 99 | Task.Run(() => 100 | { 101 | var filePaths = this.FindFiles(folderPaths); 102 | if (includeCurrent) 103 | filePaths.Add(FeaturesListPath); 104 | 105 | if (_closing) 106 | return; 107 | 108 | var foundFeatures = this.SearchFeatures(filePaths); 109 | var features = new HashSet(); 110 | 111 | if (_closing) 112 | return; 113 | 114 | for (var i = 0; i < foundFeatures.Length; ++i) 115 | { 116 | var f = foundFeatures[i]; 117 | 118 | var name = f.Trim(); 119 | name = name.TrimStart('!'); 120 | name = name.TrimStart('-'); 121 | name = name.TrimEnd('-'); 122 | features.Add(name); 123 | 124 | if (name.StartsWith("feature")) 125 | features.Add("gf" + name.Substring("feature".Length)); 126 | } 127 | 128 | var sb = new StringBuilder(); 129 | 130 | if (features.Any()) 131 | { 132 | sb.AppendLine("// This file contains a number of strings that *could* be feature names."); 133 | sb.AppendLine("// The editor checks every line against the features and uses them as names"); 134 | sb.AppendLine("// if they turn out to be valid."); 135 | sb.AppendLine(""); 136 | foreach (var feature in features.OrderBy(a => a).Where(a => !string.IsNullOrWhiteSpace(a))) 137 | sb.AppendLine(feature); 138 | } 139 | else 140 | { 141 | sb.AppendLine("No feature names found."); 142 | } 143 | 144 | this.Invoke((MethodInvoker)delegate 145 | { 146 | this.TxtResults.Text = sb.ToString(); 147 | this.BtnSearch.Enabled = true; 148 | this.GrpFolders.Enabled = true; 149 | this.ProgressBar.Value = this.ProgressBar.Maximum; 150 | 151 | if (features.Any()) 152 | this.BtnSave.Enabled = true; 153 | 154 | var totalCount = features.Count; 155 | var newCount = (totalCount - FeaturesFile.FetureNameCount); 156 | 157 | if (newCount > 0) 158 | MessageBox.Show(this, $"Found {totalCount} potential feature names, {newCount} more than in the features.txt.", "", MessageBoxButtons.OK, MessageBoxIcon.Information); 159 | else if (newCount == 0) 160 | MessageBox.Show(this, $"Found {totalCount} potential feature names, no new ones were found.", "", MessageBoxButtons.OK, MessageBoxIcon.Information); 161 | else 162 | MessageBox.Show(this, $"Found {totalCount} potential feature names.", "", MessageBoxButtons.OK, MessageBoxIcon.Information); 163 | }); 164 | }); 165 | } 166 | 167 | /// 168 | /// Returns list of files that may be searched for feature names, 169 | /// ignores folders that don't exist, but gives a warning about 170 | /// them. 171 | /// 172 | /// 173 | /// 174 | private HashSet FindFiles(string[] paths) 175 | { 176 | var result = new HashSet(); 177 | 178 | foreach (var path in paths) 179 | { 180 | if (_closing) 181 | return result; 182 | 183 | if (!Directory.Exists(path)) 184 | { 185 | this.Invoke((MethodInvoker)delegate 186 | { 187 | MessageBox.Show(this, $"Directory '{path}' not found.", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); 188 | }); 189 | continue; 190 | } 191 | 192 | foreach (var filePath in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)) 193 | { 194 | if (_closing) 195 | return result; 196 | 197 | var ext = Path.GetExtension(filePath); 198 | if (!FileExtensions.Contains(ext)) 199 | continue; 200 | 201 | result.Add(filePath); 202 | } 203 | } 204 | 205 | return result; 206 | } 207 | 208 | /// 209 | /// Searches for feature names in given files and returns them, 210 | /// ignores files that don't exist. 211 | /// 212 | /// 213 | /// 214 | private string[] SearchFeatures(IEnumerable filePaths) 215 | { 216 | var result = new HashSet(); 217 | 218 | this.Invoke((MethodInvoker)delegate 219 | { 220 | this.ProgressBar.Maximum = filePaths.Count(); 221 | }); 222 | 223 | Parallel.ForEach(filePaths, filePath => 224 | { 225 | if (_closing) 226 | return; 227 | 228 | if (!File.Exists(filePath)) 229 | return; 230 | 231 | var isFeatureList = (filePath == FeaturesListPath); 232 | 233 | using (var fr = new StreamReader(filePath)) 234 | { 235 | string line = null; 236 | while ((line = fr.ReadLine()) != null) 237 | { 238 | if (_closing) 239 | return; 240 | 241 | if (!isFeatureList && line.StartsWith("// This file contains a number of strings that *could* be feature names.")) 242 | isFeatureList = true; 243 | 244 | if (isFeatureList) 245 | { 246 | line = line.Trim(); 247 | if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith("//")) 248 | { 249 | lock (result) 250 | result.Add(line); 251 | } 252 | 253 | continue; 254 | } 255 | 256 | var matches = GfRegex.Matches(line); 257 | foreach (Match match in matches) 258 | { 259 | lock (result) 260 | result.Add(match.Groups[1].Value); 261 | } 262 | 263 | matches = FeatureStrRegex.Matches(line); 264 | foreach (Match match in matches) 265 | { 266 | lock (result) 267 | result.Add(match.Groups[1].Value); 268 | } 269 | 270 | matches = FeatureAttr1Regex.Matches(line); 271 | foreach (Match match in matches) 272 | { 273 | lock (result) 274 | result.Add(match.Groups[1].Value); 275 | } 276 | 277 | matches = FeatureAttr2Regex.Matches(line); 278 | foreach (Match match in matches) 279 | { 280 | lock (result) 281 | result.Add(match.Groups[1].Value); 282 | } 283 | } 284 | } 285 | 286 | if (_closing) 287 | return; 288 | 289 | try 290 | { 291 | this.Invoke((MethodInvoker)delegate 292 | { 293 | this.ProgressBar.Increment(1); 294 | }); 295 | } 296 | catch (ObjectDisposedException) 297 | { 298 | } 299 | }); 300 | 301 | result.RemoveWhere(a => a.Length > 40 || a.Any(b => b > 128)); 302 | 303 | var multi = result.Where(a => a.Contains('|')).ToArray(); 304 | foreach (var name in multi) 305 | { 306 | var split = name.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries); 307 | foreach (var s in split) 308 | result.Add(s); 309 | 310 | result.Remove(name); 311 | } 312 | 313 | return result.ToArray(); 314 | } 315 | 316 | /// 317 | /// Returns hash for the given string. 318 | /// 319 | /// 320 | /// 321 | public static uint GetStringHash(string str) 322 | { 323 | var s = 5381; 324 | foreach (var ch in str) 325 | s = s * 33 + ch; 326 | return (uint)s; 327 | } 328 | } 329 | } 330 | -------------------------------------------------------------------------------- /Fetitor/FrmUpdateFeatureNames.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | Enter one directory per line for Fetitor to search through for feature names, such as an extraced Mabinogi data folder. The results will be combined with the current feature names and you can update your features.txt with the results by clicking Save. The file types Fetitor searches are .xml, .txt, and .data. 122 | 123 | -------------------------------------------------------------------------------- /Fetitor/MyScintilla.cs: -------------------------------------------------------------------------------- 1 | // This program is free software: you can redistribute it and/or modify 2 | // it under the terms of the GNU General Public License as published by 3 | // the Free Software Foundation, either version 3 of the License, or 4 | // (at your option) any later version. 5 | // 6 | // This program is distributed in the hope that it will be useful, 7 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 8 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 | // GNU General Public License for more details. 10 | // 11 | // You should have received a copy of the GNU General Public License 12 | // along with this program. If not, see . 13 | 14 | using ScintillaNET; 15 | using System; 16 | using System.Windows.Forms; 17 | 18 | namespace Fetitor 19 | { 20 | /// 21 | /// A version of Scintilla with additional hotkeys. 22 | /// 23 | class MyScintilla : Scintilla 24 | { 25 | /// 26 | /// Raised when Ctrl+S is pressed. 27 | /// 28 | public event EventHandler CtrlS; 29 | 30 | /// 31 | /// Raised when Ctrl+F is pressed. 32 | /// 33 | public event EventHandler CtrlF; 34 | 35 | /// 36 | /// Catches hotkeys and raises their events. 37 | /// 38 | /// 39 | /// 40 | /// 41 | protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 42 | { 43 | switch (keyData) 44 | { 45 | case Keys.Control | Keys.S: 46 | this.CtrlS?.Invoke(this, null); 47 | return true; 48 | 49 | case Keys.Control | Keys.F: 50 | this.CtrlF?.Invoke(this, null); 51 | return true; 52 | } 53 | 54 | return base.ProcessCmdKey(ref msg, keyData); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Fetitor/Program.cs: -------------------------------------------------------------------------------- 1 | // This program is free software: you can redistribute it and/or modify 2 | // it under the terms of the GNU General Public License as published by 3 | // the Free Software Foundation, either version 3 of the License, or 4 | // (at your option) any later version. 5 | // 6 | // This program is distributed in the hope that it will be useful, 7 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 8 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 | // GNU General Public License for more details. 10 | // 11 | // You should have received a copy of the GNU General Public License 12 | // along with this program. If not, see . 13 | 14 | using System; 15 | using System.Windows.Forms; 16 | 17 | namespace Fetitor 18 | { 19 | static class Program 20 | { 21 | /// 22 | /// Der Haupteinstiegspunkt für die Anwendung. 23 | /// 24 | [STAThread] 25 | static void Main() 26 | { 27 | Application.EnableVisualStyles(); 28 | Application.SetCompatibleTextRenderingDefault(false); 29 | Application.Run(new FrmMain()); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Fetitor/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Allgemeine Informationen über eine Assembly werden über die folgenden 6 | // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, 7 | // die mit einer Assembly verknüpft sind. 8 | [assembly: AssemblyTitle("Fetitor")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Microsoft")] 12 | [assembly: AssemblyProduct("Fetitor")] 13 | [assembly: AssemblyCopyright("Copyright © Microsoft 2015")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar 18 | // für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von 19 | // COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. 20 | [assembly: ComVisible(false)] 21 | 22 | // Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird 23 | [assembly: Guid("a09271cf-f044-42a5-b6dd-f45cbd0f9902")] 24 | 25 | // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: 26 | // 27 | // Hauptversion 28 | // Nebenversion 29 | // Buildnummer 30 | // Revision 31 | // 32 | // Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern 33 | // übernehmen, indem Sie "*" eingeben: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /Fetitor/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Dieser Code wurde von einem Tool generiert. 4 | // Laufzeitversion:4.0.30319.42000 5 | // 6 | // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 7 | // der Code erneut generiert wird. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace Fetitor.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. 17 | /// 18 | // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert 19 | // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. 20 | // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen 21 | // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Fetitor.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle 51 | /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Fetitor/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /Fetitor/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Dieser Code wurde von einem Tool generiert. 4 | // Laufzeitversion:4.0.30319.42000 5 | // 6 | // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn 7 | // der Code erneut generiert wird. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace Fetitor.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.7.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | 26 | [global::System.Configuration.UserScopedSettingAttribute()] 27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 28 | [global::System.Configuration.DefaultSettingValueAttribute("")] 29 | public string NameSearchFolders { 30 | get { 31 | return ((string)(this["NameSearchFolders"])); 32 | } 33 | set { 34 | this["NameSearchFolders"] = value; 35 | } 36 | } 37 | 38 | [global::System.Configuration.UserScopedSettingAttribute()] 39 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 40 | [global::System.Configuration.DefaultSettingValueAttribute("False")] 41 | public bool WindowMaximized { 42 | get { 43 | return ((bool)(this["WindowMaximized"])); 44 | } 45 | set { 46 | this["WindowMaximized"] = value; 47 | } 48 | } 49 | 50 | [global::System.Configuration.UserScopedSettingAttribute()] 51 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 52 | [global::System.Configuration.DefaultSettingValueAttribute("-1, -1")] 53 | public global::System.Drawing.Point WindowLocation { 54 | get { 55 | return ((global::System.Drawing.Point)(this["WindowLocation"])); 56 | } 57 | set { 58 | this["WindowLocation"] = value; 59 | } 60 | } 61 | 62 | [global::System.Configuration.UserScopedSettingAttribute()] 63 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 64 | [global::System.Configuration.DefaultSettingValueAttribute("-1, -1")] 65 | public global::System.Drawing.Size WindowSize { 66 | get { 67 | return ((global::System.Drawing.Size)(this["WindowSize"])); 68 | } 69 | set { 70 | this["WindowSize"] = value; 71 | } 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /Fetitor/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | False 10 | 11 | 12 | -1, -1 13 | 14 | 15 | -1, -1 16 | 17 | 18 | -------------------------------------------------------------------------------- /Fetitor/ToolStripRendererNL.cs: -------------------------------------------------------------------------------- 1 | // This program is free software: you can redistribute it and/or modify 2 | // it under the terms of the GNU General Public License as published by 3 | // the Free Software Foundation, either version 3 of the License, or 4 | // (at your option) any later version. 5 | // 6 | // This program is distributed in the hope that it will be useful, 7 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 8 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 | // GNU General Public License for more details. 10 | // 11 | // You should have received a copy of the GNU General Public License 12 | // along with this program. If not, see . 13 | 14 | using System.Windows.Forms; 15 | 16 | namespace Fetitor 17 | { 18 | /// 19 | /// ToolStrip renderer without border. 20 | /// 21 | public class ToolStripRendererNL : ToolStripSystemRenderer 22 | { 23 | /// 24 | /// Skips border rendering. 25 | /// 26 | /// 27 | protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) 28 | { 29 | //base.OnRenderToolStripBorder(e); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Fetitor/app.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | False 15 | 16 | 17 | -1, -1 18 | 19 | 20 | -1, -1 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Fetitor/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exectails/Fetitor/c1a5f42c9303dbed41766f9dfccdf598bf2833c9/Fetitor/icon.ico -------------------------------------------------------------------------------- /Lib/jacobslusser.ScintillaNET.3.2.0-rc/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015, Jacob Slusser, https://github.com/jacobslusser 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Lib/jacobslusser.ScintillaNET.3.2.0-rc/ScintillaNET.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exectails/Fetitor/c1a5f42c9303dbed41766f9dfccdf598bf2833c9/Lib/jacobslusser.ScintillaNET.3.2.0-rc/ScintillaNET.dll -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Fetitor 2 | ============================================================================= 3 | 4 | Fetitor is an editor for Mabinogi's features file (features.xml.compiled), 5 | which is essentially a compiled XML file. It converts it to XML and back 6 | on the fly, to allow the user to edit it more quickly than if they had to 7 | convert it first, open and edit it, and convert it back. 8 | 9 | Features 10 | ----------------------------------------------------------------------------- 11 | 12 | - Editing Mabinogi's .xml.compiled files. 13 | - Jump list to find specific features more quickly. 14 | 15 | Preview 16 | ----------------------------------------------------------------------------- 17 | 18 | ![](preview.png) 19 | 20 | Links 21 | ------------------------------ 22 | * GitHub: https://github.com/exectails/Fetitor 23 | -------------------------------------------------------------------------------- /icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exectails/Fetitor/c1a5f42c9303dbed41766f9dfccdf598bf2833c9/icon.ico -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exectails/Fetitor/c1a5f42c9303dbed41766f9dfccdf598bf2833c9/icon.png -------------------------------------------------------------------------------- /preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exectails/Fetitor/c1a5f42c9303dbed41766f9dfccdf598bf2833c9/preview.png --------------------------------------------------------------------------------